From c2b79d9148f21c3717f1eaa2d37b837b0922b94c Mon Sep 17 00:00:00 2001 From: Alan Mackenzie Date: Mon, 17 Oct 2022 20:33:26 +0000 Subject: [PATCH] CC Mode: Don't fontify as types variables with the same names as struct tags This fixes bug #58534. * lisp/progmodes/cc-engine.el (c-forward-type): Only regard "struct" keywords which create self contained types (e.g. C++'s "typename") as creating found types. * lisp/progmodes/cc-langs.el (c-self-contained-typename-kwds (c-self-contained-typename-key): New language consts and variable. --- lisp/progmodes/cc-engine.el | 13 +++++++++---- lisp/progmodes/cc-langs.el | 13 ++++++++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index 223b1e917fe..596cccdf48e 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -9055,7 +9055,8 @@ multi-line strings (but not C++, for example)." (c-forward-<>-arglist t) (c-forward-syntactic-ws)) - (let ((start (point)) pos res name-res id-start id-end id-range) + (let ((start (point)) pos res name-res id-start id-end id-range + post-prefix-pos) ;; Skip leading type modifiers. If any are found we know it's a ;; prefix of a type. @@ -9067,6 +9068,7 @@ multi-line strings (but not C++, for example)." (c-forward-syntactic-ws) (or (eq res 'no-id) (setq res 'prefix)))) + (setq post-prefix-pos (point)) (cond ((looking-at c-typeof-key) ; e.g. C++'s "decltype". @@ -9099,9 +9101,12 @@ multi-line strings (but not C++, for example)." (setq name-res (c-forward-name)) (setq res (not (null name-res))) (when (eq name-res t) - ;; In many languages the name can be used without the - ;; prefix, so we add it to `c-found-types'. - (c-add-type pos (point)) + ;; With some keywords the name can be used without the prefix, so we + ;; add the name to `c-found-types' when this is the case. + (when (save-excursion + (goto-char post-prefix-pos) + (looking-at c-self-contained-typename-key)) + (c-add-type pos (point))) (when (and c-record-type-identifiers c-last-identifier-range) (c-record-type-id c-last-identifier-range))) diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el index b17718cfd54..6ccd6c30df9 100644 --- a/lisp/progmodes/cc-langs.el +++ b/lisp/progmodes/cc-langs.el @@ -2294,11 +2294,22 @@ declaration with a type as a default value. This is used only in C++ Mode, e.g. \"\"." t nil c++ '("class" "typename")) - (c-lang-defconst c-template-typename-key t (c-make-keywords-re t (c-lang-const c-template-typename-kwds))) (c-lang-defvar c-template-typename-key (c-lang-const c-template-typename-key)) +(c-lang-defconst c-self-contained-typename-kwds + "Keywords where the following name is a type name which can be +used in declarations without the keyword." + t nil + c++ '("typename")) + +(c-lang-defconst c-self-contained-typename-key + ;; Adorned regexp matching `c-self-contained-typename-key'. + t (c-make-keywords-re t (c-lang-const c-self-contained-typename-kwds))) +(c-lang-defvar c-self-contained-typename-key + (c-lang-const c-self-contained-typename-key)) + (c-lang-defconst c-type-prefix-kwds "Keywords where the following name - if any - is a type name, and where the keyword together with the symbol works as a type in -- 2.39.2