]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix fontification bugs with constructors and const.
authorAlan Mackenzie <acm@muc.de>
Sat, 19 Oct 2013 15:11:07 +0000 (15:11 +0000)
committerAlan Mackenzie <acm@muc.de>
Sat, 19 Oct 2013 15:11:07 +0000 (15:11 +0000)
* 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.

lisp/ChangeLog
lisp/progmodes/cc-engine.el

index 883b5d7b21e799e32d519a061d329c9536e8110c..402ef8062a1a8160622be7e3f1fc93b37c0db123 100644 (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
index d624d1eaed280792fd4197a50d5a9f3cfbaf432c..0d25e1355e75d1e0777102982c937df0ea1791c2 100644 (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