Commit a1a777ff authored by Alan Mackenzie's avatar Alan Mackenzie

Handle the C++ "identifiers" "final" and "override" correctly.

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

* 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".
parent 0ca712ca
......@@ -7263,6 +7263,12 @@ comment at the start of cc-engine.el for more info."
(goto-char (match-end 1))
;; 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))
(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))
(catch 'at-decl-or-cast
......@@ -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.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment