GNU bug report logs -
#16585
c-invalidate-state-cache fails if called when narrowed
Previous Next
Full log
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
c-invalidate-state-cache can fail if called in a narrowed region: we end
up calling c-clear-char-property for bob even if that's before
point-min, causing remote-text-properties to raise (args-out-of-range 1 2).
We get into this situation when expanding yasnippet snippets; we're
calling c-invalidate-state-cache from c-before-change.
To repro manually, first write this to some buffer.
#include <stdio.h>
void foo() {
}
Then (this is important) run M-x c-mode. After starting the mode, move
point to inside foo's body and eval (save-restriction (narrow-to-region
(point-at-bol) (point-at-eol)) (c-invalidate-state-cache (point))). You
should break into the debugger.
The patch below seems correct and fixes the problem for me, but it'd be
nice if Alan could take a look at it before I push it to trunk. The
version of c-invalidate-state-cache in cc-mode trunk is very different.
=== modified file 'lisp/progmodes/cc-engine.el'
--- lisp/progmodes/cc-engine.el 2014-01-19 12:32:47 +0000
+++ lisp/progmodes/cc-engine.el 2014-01-29 02:07:44 +0000
@@ -3318,15 +3318,17 @@
;; of all parens in preprocessor constructs, except for any such
construct
;; containing point. We can then call `c-invalidate-state-cache-1'
without
;; worrying further about macros and template delimiters.
- (c-with-<->-as-parens-suppressed
- (if (and c-state-old-cpp-beg
- (< c-state-old-cpp-beg here))
- (c-with-all-but-one-cpps-commented-out
- c-state-old-cpp-beg
- (min c-state-old-cpp-end here)
- (c-invalidate-state-cache-1 here))
- (c-with-cpps-commented-out
- (c-invalidate-state-cache-1 here)))))
+ (save-restriction
+ (widen)
+ (c-with-<->-as-parens-suppressed
+ (if (and c-state-old-cpp-beg
+ (< c-state-old-cpp-beg here))
+ (c-with-all-but-one-cpps-commented-out
+ c-state-old-cpp-beg
+ (min c-state-old-cpp-end here)
+ (c-invalidate-state-cache-1 here))
+ (c-with-cpps-commented-out
+ (c-invalidate-state-cache-1 here))))))
(defmacro c-state-maybe-marker (place marker)
;; If PLACE is non-nil, return a marker marking it, otherwise nil.
This bug report was last modified 11 years and 101 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.