emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Font-lock does not fontify const pointer declaration


From: Alan Mackenzie
Subject: Re: Font-lock does not fontify const pointer declaration
Date: Thu, 17 Apr 2008 08:49:18 +0000
User-agent: Mutt/1.5.9i

Good Morning, Simon!

On Thu, Sep 14, 2006 at 03:32:38PM +0100, Marshall, Simon wrote:
> Emacs 19-21 fontifies the following C/C++ snippet:

>   int *p;                     // ok
>   const int *p;               // ok
>   int *const p;               // not ok in CVS emacs
>   const int *const p; // not ok in CVS emacs

> so that "p" is in font-lock-variable-name-face.  

> In Emacs CVS, it does not fontify "p" when p is declared as a const pointer.

This was a bug in one of the regexps parsing declarators, namely
c-type-decl-prefix-key.  It was recognising "const" as an identifier,
because the explicit check for "const\|throw\|volatile" came later in the
regexp than "[[:alpha:]_]....".

Please apply the following patch, which fixes it, and let me know if it
works or not.  PLEASE NOTE: because a macro in cc-langs has changed, you
need to recompile cc-{mode,engine}.el.  Here's a recipe for this, after
patching the files:

M-x byte-compile-file cc-langs.el
M-x load-file cc-langs.elc
M-x byte-compile-file cc-mode.el
M-x load-file cc-mode.elc
M-x byte-compile-file cc-engine.el
M-x load-file cc-engine.el

M-x c++-mode



Index: cc-langs.el
===================================================================
RCS file: /cvsroot/cc-mode/cc-mode/cc-langs.el,v
retrieving revision 5.267.2.16
diff -c -r5.267.2.16 cc-langs.el
*** cc-langs.el 15 Apr 2008 20:05:59 -0000      5.267.2.16
--- cc-langs.el 17 Apr 2008 08:12:30 -0000
***************
*** 2596,2610 ****
    c++  (concat "\\("
               "[*\(&]"
               "\\|"
!              (concat "\\("    ; 2
                       ;; If this matches there's special treatment in
                       ;; `c-font-lock-declarators' and
                       ;; `c-font-lock-declarations' that check for a
                       ;; complete name followed by ":: *".
                       (c-lang-const c-identifier-start)
                       "\\)")
-              "\\|"
-              (c-lang-const c-type-decl-prefix-key)
               "\\)"
               "\\([^=]\\|$\\)")
    pike "\\(\\*\\)\\([^=]\\|$\\)")
--- 2596,2610 ----
    c++  (concat "\\("
               "[*\(&]"
               "\\|"
!              (c-lang-const c-type-decl-prefix-key)
!              "\\|"
!              (concat "\\("   ; 3
                       ;; If this matches there's special treatment in
                       ;; `c-font-lock-declarators' and
                       ;; `c-font-lock-declarations' that check for a
                       ;; complete name followed by ":: *".
                       (c-lang-const c-identifier-start)
                       "\\)")
               "\\)"
               "\\([^=]\\|$\\)")
    pike "\\(\\*\\)\\([^=]\\|$\\)")
Index: cc-engine.el
===================================================================
RCS file: /cvsroot/cc-mode/cc-mode/cc-engine.el,v
retrieving revision 5.539.2.17
diff -c -r5.539.2.17 cc-engine.el
*** cc-engine.el        15 Apr 2008 20:05:59 -0000      5.539.2.17
--- cc-engine.el        17 Apr 2008 08:12:35 -0000
***************
*** 5399,5406 ****
        ;; `c-font-lock-declarators'.)
        (while (and (looking-at c-type-decl-prefix-key)
                  (if (and (c-major-mode-is 'c++-mode)
!                          (match-beginning 2))
!                     ;; If the second 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))
--- 5400,5407 ----
        ;; `c-font-lock-declarators'.)
        (while (and (looking-at c-type-decl-prefix-key)
                  (if (and (c-major-mode-is 'c++-mode)
!                          (match-beginning 3))
!                     ;; 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))
Index: cc-fonts.el
===================================================================
RCS file: /cvsroot/cc-mode/cc-mode/cc-fonts.el,v
retrieving revision 5.205.2.6
diff -c -r5.205.2.6 cc-fonts.el
*** cc-fonts.el 15 Apr 2008 18:31:12 -0000      5.205.2.6
--- cc-fonts.el 17 Apr 2008 08:12:36 -0000
***************
*** 866,873 ****
              ;; `c-forward-decl-or-cast-1'.)
              (while (and (looking-at c-type-decl-prefix-key)
                          (if (and (c-major-mode-is 'c++-mode)
!                                  (match-beginning 2))
!                             ;; If the second submatch matches in C++ then
                              ;; we're looking at an identifier that's a
                              ;; prefix only if it specifies a member pointer.
                              (progn
--- 866,873 ----
              ;; `c-forward-decl-or-cast-1'.)
              (while (and (looking-at c-type-decl-prefix-key)
                          (if (and (c-major-mode-is 'c++-mode)
!                                  (match-beginning 3))
!                             ;; 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.
                              (progn


> Simon.

-- 
Alan Mackenzie (Nuremberg, Germany).




reply via email to

[Prev in Thread] Current Thread [Next in Thread]