From: Alan Mackenzie Date: Sat, 2 Aug 2014 18:52:48 +0000 (+0000) Subject: Fix confusion in C++ file caused by comma in "= {1,2},". X-Git-Tag: emacs-25.0.90~2635^2~679^2~540 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=d6c17223fe47050708c3162d755fe91b1d6c73e7;p=emacs.git Fix confusion in C++ file caused by comma in "= {1,2},". cc-engine.el (c-beginning-of-statement-1): In checking for a statement boundary marked by "}", check there's no "=" before the "{". (c-guess-basic-syntax CASE 9B): Call c-beginning-of-statement with non-nil `comma-delim' argument. cc-fonts.el (c-font-lock-declarators): Parse an initializer expression more accurately. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 83975cb885b..a6d526b1c51 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,15 @@ 2014-08-02 Alan Mackenzie + Fix confusion in C++ file caused by comma in "= {1,2},". Bug + #17756. + * progmodes/cc-engine.el (c-beginning-of-statement-1): In checking + for a statement boundary marked by "}", check there's no "=" + before the "{". + (c-guess-basic-syntax CASE 9B): Call c-beginning-of-statement with + non-nil `comma-delim' argument. + * progmodes/cc-fonts.el (c-font-lock-declarators): Parse an + initializer expression more accurately. + Correct loop termination condition in c-syntactic-skip-backward. * progmodes/cc-engine.el (c-syntactic-skip-backward): Correct for the situation where, after moving back out of a literal, diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index 0a96b155498..626e131ed22 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -1033,7 +1033,10 @@ comment at the start of cc-engine.el for more info." ;; Just gone back over a brace block? ((and (eq (char-after) ?{) - (not (c-looking-at-inexpr-block lim nil t))) + (not (c-looking-at-inexpr-block lim nil t)) + (save-excursion + (c-backward-token-2 1 t nil) + (not (looking-at "=\\([^=]\\|$\\)")))) (save-excursion (c-forward-sexp) (point))) ;; Just gone back over some paren block? @@ -10476,7 +10479,7 @@ comment at the start of cc-engine.el for more info." (if (eq (point) (c-point 'boi)) (c-add-syntax 'brace-list-close (point)) (setq lim (c-most-enclosing-brace c-state-cache (point))) - (c-beginning-of-statement-1 lim) + (c-beginning-of-statement-1 lim nil nil t) (c-add-stmt-syntax 'brace-list-close nil t lim paren-state))) (t diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el index bf5630da045..8ee8054876d 100644 --- a/lisp/progmodes/cc-fonts.el +++ b/lisp/progmodes/cc-fonts.el @@ -1037,7 +1037,8 @@ casts and declarations are fontified. Used on level 2 and higher." paren-depth id-face got-init c-last-identifier-range - (separator-prop (if types 'c-decl-type-start 'c-decl-id-start))) + (separator-prop (if types 'c-decl-type-start 'c-decl-id-start)) + brackets-after-id) ;; The following `while' fontifies a single declarator id each time round. ;; It loops only when LIST is non-nil. @@ -1110,13 +1111,24 @@ casts and declarations are fontified. Used on level 2 and higher." ;; Search syntactically to the end of the declarator (";", ;; ",", a closing paren, eob etc) or to the beginning of an ;; initializer or function prototype ("=" or "\\s\("). - ;; Note that the open paren will match array specs in - ;; square brackets, and we treat them as initializers too. - (c-syntactic-re-search-forward - "[;,]\\|\\s)\\|\\'\\|\\(=\\|\\s(\\)" limit t t)) + ;; Note that square brackets are now not also treated as + ;; initializers, since this broke when there were also + ;; initializing brace lists. + (let (found) + (while + (and (setq found + (c-syntactic-re-search-forward + "[;,]\\|\\s)\\|\\'\\|\\(=\\|\\s(\\)" limit t t)) + (eq (char-before) ?\[)) + (backward-char) + (c-safe (c-forward-sexp 1)) + (setq found nil) + (setq brackets-after-id t)) + found)) (setq next-pos (match-beginning 0) id-face (if (and (eq (char-after next-pos) ?\() + (not brackets-after-id) (let (c-last-identifier-range) (save-excursion (goto-char next-pos) @@ -1486,9 +1498,12 @@ casts and declarations are fontified. Used on level 2 and higher." c-recognize-knr-p) ; Strictly speaking, bogus, but it ; speeds up lisp.h tremendously. (save-excursion + (unless (or (eobp) + (looking-at "\\s(\\|\\s)")) + (forward-char)) (setq bod-res (car (c-beginning-of-decl-1 decl-search-lim))) (if (and (eq bod-res 'same) - (progn + (save-excursion (c-backward-syntactic-ws) (eq (char-before) ?\}))) (c-beginning-of-decl-1 decl-search-lim))