Fix fontification bugs with constructors and const.

* progmodes/cc-engine.el (c-forward-decl-or-cast-1): (Just after
CASE 2) Remove the check for the absence of a suffix construct
after a function declaration with only types (no identifiers) in
the parentheses.  Also, accept a function declaration with just a
type inside the parentheses, if this type can be positively
recognised as such, or if a prefix keyword like "explicit" nails
down the construct as a declaration.
This commit is contained in:
Alan Mackenzie 2013-10-19 15:11:07 +00:00
parent 8d02f0ad3b
commit 033f22ddad
2 changed files with 40 additions and 18 deletions

View file

@ -1,3 +1,15 @@
2013-10-19 Alan Mackenzie <acm@muc.de>
Fix fontification bugs with constructors and const.
* progmodes/cc-engine.el (c-forward-decl-or-cast-1): (Just after
CASE 2) Remove the check for the absence of a suffix construct
after a function declaration with only types (no identifiers) in
the parentheses. Also, accept a function declaration with just a
type inside the parentheses, if this type can be positively
recognised as such, or if a prefix keyword like "explicit" nails
down the construct as a declaration.
2013-10-19 Eli Zaretskii <eliz@gnu.org>
* menu-bar.el (tty-menu-navigation-map): Bind mouse-N to perform

View file

@ -6917,7 +6917,9 @@ comment at the start of cc-engine.el for more info."
;; can happen since we don't know if
;; `c-restricted-<>-arglists' will be correct inside the
;; arglist paren that gets entered.
c-parse-and-markup-<>-arglists)
c-parse-and-markup-<>-arglists
;; Start of the identifier for which `got-identifier' was set.
name-start)
(goto-char id-start)
@ -6935,7 +6937,9 @@ comment at the start of cc-engine.el for more info."
;; If the third submatch matches in C++ then
;; we're looking at an identifier that's a
;; prefix only if it specifies a member pointer.
(when (setq got-identifier (c-forward-name))
(when (progn (setq pos (point))
(setq got-identifier (c-forward-name)))
(setq name-start pos)
(if (looking-at "\\(::\\)")
;; We only check for a trailing "::" and
;; let the "*" that should follow be
@ -6961,7 +6965,9 @@ comment at the start of cc-engine.el for more info."
;; Skip over an identifier.
(or got-identifier
(and (looking-at c-identifier-start)
(setq got-identifier (c-forward-name))))
(setq pos (point))
(setq got-identifier (c-forward-name))
(setq name-start pos)))
;; Skip over type decl suffix operators.
(while (if (looking-at c-type-decl-suffix-key)
@ -7052,23 +7058,27 @@ comment at the start of cc-engine.el for more info."
;; declaration.
(throw 'at-decl-or-cast t))
(when (and got-parens
(not got-prefix)
(not got-suffix-after-parens)
(or backup-at-type
maybe-typeless
backup-maybe-typeless))
;; Got a declaration of the form "foo bar (gnu);" where we've
;; recognized "bar" as the type and "gnu" as the declarator.
;; In this case it's however more likely that "bar" is the
;; declarator and "gnu" a function argument or initializer (if
;; `c-recognize-paren-inits' is set), since the parens around
;; "gnu" would be superfluous if it's a declarator. Shift the
;; type one step backward.
(c-fdoc-shift-type-backward)))
;; Found no identifier.
(when (and got-parens
(not got-prefix)
;; (not got-suffix-after-parens)
(or backup-at-type
maybe-typeless
backup-maybe-typeless
(eq at-decl-or-cast t)
(save-excursion
(goto-char name-start)
(not (memq (c-forward-type) '(nil maybe))))))
;; Got a declaration of the form "foo bar (gnu);" or "bar
;; (gnu);" where we've recognized "bar" as the type and "gnu"
;; as the declarator. In this case it's however more likely
;; that "bar" is the declarator and "gnu" a function argument
;; or initializer (if `c-recognize-paren-inits' is set),
;; since the parens around "gnu" would be superfluous if it's
;; a declarator. Shift the type one step backward.
(c-fdoc-shift-type-backward)))
;; Found no identifier.
(if backup-at-type
(progn