]> git.eshelyaron.com Git - emacs.git/commitdiff
Partially correct fontification of "(b*3)", and the like, in C++ Mode
authorAlan Mackenzie <acm@muc.de>
Thu, 29 Dec 2016 15:34:36 +0000 (15:34 +0000)
committerAlan Mackenzie <acm@muc.de>
Thu, 29 Dec 2016 15:34:36 +0000 (15:34 +0000)
This problem is caused by the fundamental ambiguity in C++ between
argument declarations and initialisation clauses.

* lisp/progmodes/cc-fonts.el (c-font-lock-declarations): If we have an open
paren preceded by an arithmetic operator, we give this the context nil, not
'arglist.

* lisp/progmodes/cc-langs.el (c-arithmetic-operators, c-arithmetic-op-regexp):
New lang consts and vars.

lisp/progmodes/cc-fonts.el
lisp/progmodes/cc-langs.el

index 26a002ac8a14cec0e820c70b292675720480c0df..39e68f0b8713dea070a9a5dcbf4691872a1b4bf8 100644 (file)
@@ -1311,6 +1311,13 @@ casts and declarations are fontified.  Used on level 2 and higher."
                     ;; multiline declaration.
                     (c-put-char-property (1- match-pos)
                                          'c-type 'c-decl-arg-start))
+                   ;; Got an open paren preceded by an arith operator.
+                   ((and (eq (char-before match-pos) ?\()
+                         (save-excursion
+                           (and (zerop (c-backward-token-2 2))
+                                (looking-at c-arithmetic-op-regexp))))
+                    (setq context nil
+                          c-restricted-<>-arglists nil))
                    (t (setq context 'arglist
                             c-restricted-<>-arglists t))))
 
index 3c328489ec1af1b7073ad887f4ef4fd9425400f5..83b8db3657e572776461890fb3fa4f8f96cafce0 100644 (file)
@@ -1248,6 +1248,22 @@ operators."
 (c-lang-defvar c-assignment-op-regexp
   (c-lang-const c-assignment-op-regexp))
 
+(c-lang-defconst c-arithmetic-operators
+  "List of all arithmetic operators, including \"+=\", etc."
+  ;; Note: in the following, there are too many operators for AWK and IDL.
+  t (append (c-lang-const c-assignment-operators)
+           '("+" "-" "*" "/" "%"
+             "<<" ">>"
+             "<" ">" "<=" ">="
+             "==" "!="
+             "&" "^" "|"
+             "&&" "||")))
+
+(c-lang-defconst c-arithmetic-op-regexp
+  t (c-make-keywords-re nil
+      (c-lang-const c-arithmetic-operators)))
+(c-lang-defvar c-arithmetic-op-regexp (c-lang-const c-arithmetic-op-regexp))
+
 (c-lang-defconst c-:$-multichar-token-regexp
   ;; Regexp matching all tokens ending in ":" which are longer than one char.
   ;; Currently (2016-01-07) only used in C++ Mode.