]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix an infinite loop in C++ Mode when we have "{ .... [ .... }"
authorAlan Mackenzie <acm@muc.de>
Thu, 25 Aug 2016 16:21:55 +0000 (16:21 +0000)
committerAlan Mackenzie <acm@muc.de>
Thu, 25 Aug 2016 16:21:55 +0000 (16:21 +0000)
* lisp/progmodes/cc-fonts.el (c-font-lock-c++-lambda-captures): In the inner
`while' form's condition, check for "\\s)" rather than merely "\\]", so that
the loop won't hang at a "terminating" paren of a different type (due to the
c-syntactic-re-search-forward at the end of the loop stopping at such
characters).

lisp/progmodes/cc-fonts.el

index 60b8b6db3cc4acdc26b45b09309c89d218f1e33e..bf8b857ca6ea4ad4095c44aa32e437a203221919 100644 (file)
@@ -1654,8 +1654,13 @@ casts and declarations are fontified.  Used on level 2 and higher."
                  (c-forward-syntactic-ws)))
            (c-backward-token-2)))
 
-       ;; Go round the following loop once per captured item.
-       (while (and (not (eq (char-after) ?\]))
+       ;; Go round the following loop once per captured item.  We use "\\s)"
+       ;; rather than "\\]" here to avoid infinite looping in this situation:
+       ;; "unsigned items [] { [ }".  The second "[" triggers this function,
+       ;; but if we don't match the "}" with an "\\s)", the
+       ;; `c-syntactic-re-search-forward' at the end of the loop fails to
+       ;; move forward over it, leaving point stuck at the "}".
+       (while (and (not (looking-at "\\s)"))
                    (< (point) limit))
          (if (eq (char-after) ?&)
              (progn (setq mode ?&)
@@ -1704,7 +1709,8 @@ casts and declarations are fontified.  Used on level 2 and higher."
            (c-forward-syntactic-ws)))
 
        (setq capture-default nil)
-       (forward-char))))                       ; over the terminating "]".
+       (if (< (point) limit)
+           (forward-char))))) ; over the terminating "]" or other close paren.
   nil)