From: Alan Mackenzie Date: Thu, 25 Aug 2016 16:21:55 +0000 (+0000) Subject: Fix an infinite loop in C++ Mode when we have "{ .... [ .... }" X-Git-Tag: emacs-26.0.90~1694 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=93c67f6b2c98ab69e25d2ca7417bcf6c15a165db;p=emacs.git Fix an infinite loop in C++ Mode when we have "{ .... [ .... }" * 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). --- diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el index 60b8b6db3cc..bf8b857ca6e 100644 --- a/lisp/progmodes/cc-fonts.el +++ b/lisp/progmodes/cc-fonts.el @@ -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)