]> git.eshelyaron.com Git - emacs.git/commitdiff
Handle the C++ "identifiers" "final" and "override" correctly.
authorAlan Mackenzie <acm@muc.de>
Sat, 27 Aug 2016 19:57:42 +0000 (19:57 +0000)
committerAlan Mackenzie <acm@muc.de>
Sat, 27 Aug 2016 19:57:42 +0000 (19:57 +0000)
This fixes bug #24319, allowing destructors affixed with these identifiers to
be correctly fontified.

* lisp/progmodes/cc-engine.el (c-forward-type, c-forward-decl-or-cast-1):
After reaching the "end" of a type expression, skip over any occurrences of
c-type-decl-suffix-ws-ids-key.

* lisp/progmodes/cc-langs.el (c-type-modifier-kwds): Remove "override" and
"final" from the C++ value.
(c-type-decl-suffix-ws-ids-kwds, c-type-decl-suffix-ws-ids-key): New lang
constants/variables for "final" and "override".

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

index ecee57e40160b3a4749c51411dafa09049cf509e..28d6618d8a042fdfbf8f99a2ebbd473592d0edb9 100644 (file)
@@ -7263,6 +7263,12 @@ comment at the start of cc-engine.el for more info."
          (goto-char (match-end 1))
          (c-forward-syntactic-ws)))
 
+      ;; Skip any "WS" identifiers (e.g. "final" or "override" in C++)
+      (while (looking-at c-type-decl-suffix-ws-ids-key)
+       (goto-char (match-end 1))
+       (c-forward-syntactic-ws)
+       (setq res t))
+
       (when c-opt-type-concat-key      ; Only/mainly for pike.
        ;; Look for a trailing operator that concatenates the type
        ;; with a following one, and if so step past that one through
@@ -8165,6 +8171,11 @@ comment at the start of cc-engine.el for more info."
          (setq type-start (point))
          (setq at-type (c-forward-type))))
 
+      ;; Move forward over any "WS" ids (like "final" or "override" in C++)
+      (while (looking-at c-type-decl-suffix-ws-ids-key)
+       (goto-char (match-end 1))
+       (c-forward-syntactic-ws))
+
       (setq
        at-decl-or-cast
        (catch 'at-decl-or-cast
index e1ccc7924abcf187b1908cc0438afb90371666ea..ae6e6a3071f4fb927cc257d4831bf144e7923bed 100644 (file)
@@ -1844,7 +1844,7 @@ but they don't build a type of themselves.  Unlike the keywords on
 not the type face."
   t    nil
   c    '("const" "restrict" "volatile")
-  c++  '("const" "noexcept" "volatile" "throw" "final" "override")
+  c++  '("const" "noexcept" "volatile" "throw")
   objc '("const" "volatile"))
 
 (c-lang-defconst c-opt-type-modifier-key
@@ -1873,6 +1873,18 @@ not the type face."
                                  (c-lang-const c-type-modifier-kwds))
                          :test 'string-equal))
 
+(c-lang-defconst c-type-decl-suffix-ws-ids-kwds
+  "\"Identifiers\" that when immediately following a declarator have semantic
+effect in the declaration, but are syntactically like whitespace."
+  t    nil
+  c++  '("final" "override"))
+
+(c-lang-defconst c-type-decl-suffix-ws-ids-key
+  ;; An adorned regexp matching `c-type-decl-suffix-ws-ids-kwds'.
+  t (c-make-keywords-re t (c-lang-const c-type-decl-suffix-ws-ids-kwds)))
+(c-lang-defvar c-type-decl-suffix-ws-ids-key
+  (c-lang-const c-type-decl-suffix-ws-ids-key))
+
 (c-lang-defconst c-class-decl-kwds
   "Keywords introducing declarations where the following block (if any)
 contains another declaration level that should be considered a class.