diff --git a/src/ChangeLog b/src/ChangeLog
index 9a8177bf43f..d01d8fbd727 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -6,6 +6,8 @@
(CHECK_TOTAL_LENGTH): Remove cast to EMACS_INT; no longer needed.
* intervals.c (interval_deletion_adjustment): Now returns EMACS_INT.
All uses changed.
+ (offset_intervals): Tell GCC not to worry about length overflow
+ when negating a negative length.
* alloc.c (overrun_check_malloc, overrun_check_realloc): Now static.
(overrun_check_free): Likewise.
diff --git a/src/intervals.c b/src/intervals.c
index 8f3840976d0..e72bc146d16 100644
--- a/src/intervals.c
+++ b/src/intervals.c
@@ -39,6 +39,7 @@ along with GNU Emacs. If not, see . */
#include
#include
+#include
#include "lisp.h"
#include "intervals.h"
#include "buffer.h"
@@ -1435,7 +1436,10 @@ offset_intervals (struct buffer *buffer, EMACS_INT start, EMACS_INT length)
if (length > 0)
adjust_intervals_for_insertion (BUF_INTERVALS (buffer), start, length);
else
- adjust_intervals_for_deletion (buffer, start, -length);
+ {
+ IF_LINT (if (length < - TYPE_MAXIMUM (EMACS_INT)) abort ();)
+ adjust_intervals_for_deletion (buffer, start, -length);
+ }
}
/* Merge interval I with its lexicographic successor. The resulting