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.
This commit is contained in:
parent
1e9341672d
commit
c2b79d9148
2 changed files with 21 additions and 5 deletions
|
@ -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)))
|
||||
|
|
|
@ -2294,11 +2294,22 @@ declaration with a type as a default value. This is used only in
|
|||
C++ Mode, e.g. \"<typename X = Y>\"."
|
||||
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
|
||||
|
|
Loading…
Add table
Reference in a new issue