From f838210b018b74b5dd86800aba807c78c921fc3a Mon Sep 17 00:00:00 2001 From: Alan Mackenzie Date: Thu, 14 Dec 2017 17:55:59 +0000 Subject: [PATCH] Fix misfontification of C++ member initialization list after "throw" * lisp/progmodes/cc-engine.el (c-forward-type): Stop recognizing a "type" starting with "throw", by using c-opt-type-modifier-prefix-key. * lisp/progmodes/cc-langs.el (c-type-modifier-prefix-kwds): New lang const which, in C++, doesn't contain "throw", otherwise like c-type-modifier-kwds. (c-opt-type-modifier-prefix-key): New lang const and var, a regexp matching any keyword in the previous lang const. --- lisp/progmodes/cc-engine.el | 4 ++-- lisp/progmodes/cc-langs.el | 28 ++++++++++++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index 138a0e5da21..881209c286e 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -7572,8 +7572,8 @@ comment at the start of cc-engine.el for more info." ;; Skip leading type modifiers. If any are found we know it's a ;; prefix of a type. - (when c-opt-type-modifier-key ; e.g. "const" "volatile", but NOT "typedef" - (while (looking-at c-opt-type-modifier-key) + (when c-opt-type-modifier-prefix-key ; e.g. "const" "volatile", but NOT "typedef" + (while (looking-at c-opt-type-modifier-prefix-key) (goto-char (match-end 1)) (c-forward-syntactic-ws) (setq res 'prefix))) diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el index 869048bee31..169b61c3dd3 100644 --- a/lisp/progmodes/cc-langs.el +++ b/lisp/progmodes/cc-langs.el @@ -1925,16 +1925,32 @@ on one of the `*-decl-kwds' lists." t (c-make-keywords-re t (c-lang-const c-type-prefix-kwds))) (c-lang-defvar c-type-prefix-key (c-lang-const c-type-prefix-key)) -(c-lang-defconst c-type-modifier-kwds - "Type modifier keywords. These can occur almost anywhere in types -but they don't build a type of themselves. Unlike the keywords on -`c-primitive-type-kwds', they are fontified with the keyword face and -not the type face." +(c-lang-defconst c-type-modifier-prefix-kwds + "Type modifier keywords which can appear in front of a type. These can +also occur almost anywhere in types but they don't build a type of +themselves. Unlike the keywords on `c-primitive-type-kwds', they are +fontified with the keyword face and not the type face." t nil c '("const" "restrict" "volatile") - c++ '("const" "noexcept" "volatile" "throw") + c++ '("const" "noexcept" "volatile") objc '("const" "volatile")) +(c-lang-defconst c-opt-type-modifier-prefix-key + ;; Adorned regexp matching `c-type-modifier-prefix-kwds', or nil in + ;; languages without such keywords. + t (and (c-lang-const c-type-modifier-prefix-kwds) + (c-make-keywords-re t (c-lang-const c-type-modifier-prefix-kwds)))) +(c-lang-defvar c-opt-type-modifier-prefix-key + (c-lang-const c-opt-type-modifier-prefix-key)) + +(c-lang-defconst c-type-modifier-kwds + "Type modifier keywords. These can occur almost anywhere in types except +at the start, but they don't build a type of themselves. Unlike the keywords +on `c-primitive-type-kwds', they are fontified with the keyword face and not +the type face." + t (c-lang-const c-type-modifier-prefix-kwds) + c++ (append (c-lang-const c-type-modifier-prefix-kwds) '("throw"))) + (c-lang-defconst c-opt-type-modifier-key ;; Adorned regexp matching `c-type-modifier-kwds', or nil in ;; languages without such keywords. -- 2.39.2