Prevent C++ Mode wrongly fontifying some identifiers near templates as types

This fixes debbugs #7917.

* lisp/progmodes/cc-engine.el (c-forward-keyword-prefixed-id): Accept 'maybe
(from c-forward-type) as sufficient to record an id.  Record type id as well
as ref ids.
(c-forward-name): Bind c-last-identifier-range around the call to
c-forward-<>-arglist to prevent it getting corrupted.  Don't automatically
assume an identifier is a type when a template ">" is followed by a "(".
(c-forward-type): Don't automatically assume an identifier is a type when a
template ">" is followed by a "(".

* lisp/progmodes/cc-fonts.el (c-font-lock-<>-arglists): Don't fontify an
identifier as a type when its associated ">" is followed by a "(".
This commit is contained in:
Alan Mackenzie 2016-04-01 12:50:14 +00:00
parent b3b523cdd6
commit 9151f16e81
2 changed files with 31 additions and 17 deletions

View file

@ -5812,10 +5812,11 @@ comment at the start of cc-engine.el for more info."
nil
(and (looking-at c-keywords-regexp)
(c-forward-keyword-clause 1))))
(when (memq res '(t known found prefix))
,(when (eq type 'ref)
`(when c-record-type-identifiers
(c-record-ref-id c-last-identifier-range)))
(when (memq res '(t known found prefix maybe))
(when c-record-type-identifiers
,(if (eq type 'type)
`(c-record-type-id c-last-identifier-range)
`(c-record-ref-id c-last-identifier-range)))
t)))
(defmacro c-forward-id-comma-list (type update-safe-pos)
@ -6371,13 +6372,15 @@ comment at the start of cc-engine.el for more info."
(eq (char-after) ?<))
;; Maybe an angle bracket arglist.
(when (let ((c-record-type-identifiers t)
(c-record-found-types t))
(c-record-found-types t)
(c-last-identifier-range))
(c-forward-<>-arglist nil))
(c-add-type start (1+ pos))
(c-forward-syntactic-ws)
(setq pos (point)
c-last-identifier-range nil)
(unless (eq (char-after) ?\()
(setq c-last-identifier-range nil)
(c-add-type start (1+ pos)))
(setq pos (point))
(if (and c-opt-identifier-concat-key
(looking-at c-opt-identifier-concat-key))
@ -6391,7 +6394,8 @@ comment at the start of cc-engine.el for more info."
(c-forward-syntactic-ws)
t)
(when (and c-record-type-identifiers id-start)
(when (and c-record-type-identifiers id-start
(not (eq (char-after) ?\()))
(c-record-type-id (cons id-start id-end)))
(setq res 'template)
nil)))
@ -6565,9 +6569,18 @@ comment at the start of cc-engine.el for more info."
;; It's an identifier that might be a type.
'maybe))))
((eq name-res 'template)
;; A template is a type.
;; A template is sometimes a type.
(goto-char id-end)
(setq res t))
(c-forward-syntactic-ws)
(setq res
(if (eq (char-after) ?\()
(if (c-check-type id-start id-end)
;; It's an identifier that has been used as
;; a type somewhere else.
'found
;; It's an identifier that might be a type.
'maybe)
t)))
(t
;; Otherwise it's an operator identifier, which is not a type.
(goto-char start)

View file

@ -914,7 +914,7 @@ casts and declarations are fontified. Used on level 2 and higher."
;;
;; Fontify types and references in names containing angle bracket
;; arglists from the point to LIMIT. Note that
;; `c-font-lock-declarations' already has handled many of them.
;; `c-font-lock-declarations' has already handled many of them.
;;
;; This function might do hidden buffer changes.
@ -976,11 +976,12 @@ casts and declarations are fontified. Used on level 2 and higher."
(when (and c-opt-identifier-concat-key
(not (get-text-property id-start 'face)))
(c-forward-syntactic-ws)
(if (looking-at c-opt-identifier-concat-key)
(c-put-font-lock-face id-start id-end
c-reference-face-name)
(c-put-font-lock-face id-start id-end
'font-lock-type-face)))))
(cond ((looking-at c-opt-identifier-concat-key)
(c-put-font-lock-face id-start id-end
c-reference-face-name))
((eq (char-after) ?\())
(t (c-put-font-lock-face id-start id-end
'font-lock-type-face))))))
(goto-char pos)))
(goto-char pos)))))