From unknown Sat Aug 09 04:56:35 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#24377 <24377@debbugs.gnu.org> To: bug#24377 <24377@debbugs.gnu.org> Subject: Status: 25.1; CC-Mode (C++) uses font-lock-type-face for ordinary variable Reply-To: bug#24377 <24377@debbugs.gnu.org> Date: Sat, 09 Aug 2025 11:56:35 +0000 retitle 24377 25.1; CC-Mode (C++) uses font-lock-type-face for ordinary var= iable reassign 24377 emacs,cc-mode submitter 24377 Bastian Beischer severity 24377 minor thanks From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 06 07:17:08 2016 Received: (at submit) by debbugs.gnu.org; 6 Sep 2016 11:17:08 +0000 Received: from localhost ([127.0.0.1]:50914 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bhENH-000139-Cp for submit@debbugs.gnu.org; Tue, 06 Sep 2016 07:17:08 -0400 Received: from eggs.gnu.org ([208.118.235.92]:36348) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bhENE-00012c-ST for submit@debbugs.gnu.org; Tue, 06 Sep 2016 07:17:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bhEN8-0004Xt-B9 for submit@debbugs.gnu.org; Tue, 06 Sep 2016 07:16:59 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, T_DKIM_INVALID autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:44429) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bhEN8-0004XX-8S for submit@debbugs.gnu.org; Tue, 06 Sep 2016 07:16:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55512) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bhEN5-0006hg-R5 for bug-gnu-emacs@gnu.org; Tue, 06 Sep 2016 07:16:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bhEMz-0004Vt-QV for bug-gnu-emacs@gnu.org; Tue, 06 Sep 2016 07:16:54 -0400 Received: from mail-wm0-x235.google.com ([2a00:1450:400c:c09::235]:38048) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bhEMz-0004VC-GN for bug-gnu-emacs@gnu.org; Tue, 06 Sep 2016 07:16:49 -0400 Received: by mail-wm0-x235.google.com with SMTP id 1so183190898wmz.1 for ; Tue, 06 Sep 2016 04:16:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:mime-version; bh=HtdaxfkDpwtBtPjMTDMQy857INFGGaUPfZYRdblYGCo=; b=MvdFjDWsE7WwpGbARvDKBVYlzWVmwzFTiludkaquULfdp28BDcrEiv2zwFKmZ1kjB5 P1gYgyXSGVN1eAnX6MXz/wAJOmid76lSpkLCNS3dK0ITmH5fBeJpOugyKjlHt5sq9WFE qlT5y+KiGPM90XPFz7QftdQjN92ex7p+Tj9xn5K+edwium9d66/2LJTXPHOWEAHUHnG3 tiJA+o5ZhvjjCbFoc2yptPBdxKCcag5P9OPJv/rEQBCeRFQnAYprSCnO+N3+93cr0hAF bmqMjIcRdD8/wOKb+UMVgi7jXOt+89Qk8p6fzMqvGUdB4sYlzlcbqlIRlm2+ZM/DGL+K 9vpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:mime-version; bh=HtdaxfkDpwtBtPjMTDMQy857INFGGaUPfZYRdblYGCo=; b=iVZ0Y67qTSPd2Xne/B5px+GZJz4qyk/AZkUHM17dqkMmeDS72VeR7Vo8sPuZ5cqUPz IZjCdUG2fXM1Z2gbwYvxC95yBi0OITJHDUVh16N10pr6Uc0Ie49uN98CvZs3eXJ6bLgJ RQVgfTEbBVer4vIMYGyypgQAdlx4KGb0hUXtwV4qBQ4bB7YpECo9VKLzPV62gIEg9TPE JFcorfr+LDS2ur2XSyjWkhAkBrIBMn+PscxksdGsLzWXm8IAJBpRHXlJb9s5r1ek+/Ax Oqf230jgb/0kGb3xyEcrCraFmfAiWWskpYpE3HOH9A0NNrHoBEKy99RjMHxZa297leiB Xt6g== X-Gm-Message-State: AE9vXwPW2X54S0WQCTUjr3RljztWBPkF1OQND/W0LpwkM7GNGm7nRC9NoW/APTjShrTsbA== X-Received: by 10.28.126.215 with SMTP id z206mr15979942wmc.7.1473160608181; Tue, 06 Sep 2016 04:16:48 -0700 (PDT) Received: from beischer-w520.gmail.com (nb1b5156.physik.rwth-aachen.de. [134.61.5.156]) by smtp.gmail.com with ESMTPSA id d62sm26071797wmd.7.2016.09.06.04.16.46 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 06 Sep 2016 04:16:47 -0700 (PDT) From: Bastian Beischer To: bug-gnu-emacs@gnu.org Subject: 25.1; CC-Mode (C++) uses font-lock-type-face for ordinary variable Date: Tue, 06 Sep 2016 13:16:41 +0200 Message-ID: <87lgz5l1ly.fsf@gmail.com> MIME-Version: 1.0 Content-Type: text/plain X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -4.0 (----) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -4.0 (----) This piece of C++ code is wrongly fontified by CC-Mode: int b = 5; int a = (b*3); Reproduce as follows: 1) emacs -Q 2) Open file "test.C" 3) Paste snippet in buffer 4) Place cursor over "b" in second line 5) M-x describe-face -> font-lock-type-face This appears to be correlated with the presence of the opening parentheses and the '*' character, because: 1) int a = b*3; does not have this problem 2) "b" gets fontified incorrectly after entering the '*' character: int a = (b* In GNU Emacs 25.1.2 (x86_64-unknown-linux-gnu, GTK+ Version 2.24.30) of 2016-08-30 built on beischer-w520 Repository revision: 17197d0ae9eac100b56078b2a48964b29710b76e Windowing system distributor 'The X.Org Foundation', version 11.0.11804000 Configured using: 'configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib --localstatedir=/var --mandir=/usr/share/man --with-gameuser=:games --with-sound=alsa --with-xft --with-modules --with-x-toolkit=gtk2 --with-gconf --without-gsettings 'CFLAGS=-march=native -O2 -pipe -fstack-protector-strong' CPPFLAGS=-D_FORTIFY_SOURCE=2 LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro' Configured features: XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GCONF NOTIFY ACL GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB TOOLKIT_SCROLL_BARS GTK2 X11 MODULES Important settings: value of $LANG: en_US.UTF-8 locale-coding-system: utf-8-unix Major mode: C++/l Minor modes in effect: diff-auto-refine-mode: t tooltip-mode: t global-eldoc-mode: t electric-indent-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t line-number-mode: t transient-mark-mode: t abbrev-mode: t Recent messages: For information about GNU Emacs and the GNU system, type C-h C-a. Followed link to /home/beischer/.vc/.emacs Mark saved where search started "Bastian Beischer" "bastian.beischer@gmail.com" "gmail.com" Quit Load-path shadows: None found. Features: (shadow sort mail-extr emacsbug message dired format-spec rfc822 mml mml-sec password-cache epg epg-config gnus-util mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util help-fns mail-prsvr mail-utils cl-extra help-mode cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs cl-loaddefs pcase cl-lib misearch multi-isearch vc-git diff-mode easymenu easy-mmode time-date mule-util tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type mwheel x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list newcomment elisp-mode lisp-mode prog-mode register page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock syntax facemenu font-core frame cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese charscript case-table epa-hook jka-cmpr-hook help simple abbrev minibuffer cl-preloaded nadvice loaddefs button faces cus-face macroexp files text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote dbusbind inotify dynamic-setting system-font-setting font-render-setting move-toolbar gtk x-toolkit x multi-tty make-network-process emacs) Memory information: ((conses 16 110659 3314) (symbols 48 22270 0) (miscs 40 57 143) (strings 32 21604 4932) (string-bytes 1 732025) (vectors 16 14743) (vector-slots 8 464634 4487) (floats 8 171 60) (intervals 56 497 7) (buffers 976 21)) From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 13 14:35:19 2016 Received: (at 24377) by debbugs.gnu.org; 13 Sep 2016 18:35:19 +0000 Received: from localhost ([127.0.0.1]:58892 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bjsYB-00005o-Cd for submit@debbugs.gnu.org; Tue, 13 Sep 2016 14:35:19 -0400 Received: from mail.muc.de ([193.149.48.3]:33489) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bjsY9-00005d-2s for 24377@debbugs.gnu.org; Tue, 13 Sep 2016 14:35:18 -0400 Received: (qmail 30626 invoked by uid 3782); 13 Sep 2016 18:35:14 -0000 Date: 13 Sep 2016 18:35:14 -0000 Message-ID: <20160913183514.30625.qmail@mail.muc.de> From: Alan Mackenzie To: Bastian Beischer Subject: Re: bug#24377: 25.1; CC-Mode (C++) uses font-lock-type-face for ordinary variable Organization: muc.de e.V. In-Reply-To: X-Newsgroups: gnu.emacs.bug User-Agent: tin/2.3.1-20141224 ("Tallant") (UNIX) (FreeBSD/10.3-RELEASE-p7 (amd64)) X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 24377 Cc: 24377@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) Hello, Bastian. In article you wrote: > This piece of C++ code is wrongly fontified by CC-Mode: > int b = 5; > int a = (b*3); > Reproduce as follows: > 1) emacs -Q > 2) Open file "test.C" > 3) Paste snippet in buffer > 4) Place cursor over "b" in second line > 5) M-x describe-face -> font-lock-type-face > This appears to be correlated with the presence of the opening > parentheses and the '*' character, because: > 1) int a = b*3; > does not have this problem > 2) "b" gets fontified incorrectly after entering the '*' character: > int a = (b* Thanks for this bug report, and thanks even more for taking the trouble to reduce the test case to just two lines. > In GNU Emacs 25.1.2 (x86_64-unknown-linux-gnu, GTK+ Version 2.24.30) > of 2016-08-30 built on beischer-w520 > Repository revision: 17197d0ae9eac100b56078b2a48964b29710b76e > Windowing system distributor 'The X.Org Foundation', version 11.0.11804000 > Configured using: > 'configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib > --localstatedir=/var --mandir=/usr/share/man --with-gameuser=:games > --with-sound=alsa --with-xft --with-modules --with-x-toolkit=gtk2 > --with-gconf --without-gsettings 'CFLAGS=-march=native -O2 -pipe > -fstack-protector-strong' CPPFLAGS=-D_FORTIFY_SOURCE=2 > LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro' [ .... ] Yes, the CC Mode fontification code was confusing the "*" with an indirection operator, such as you might get in "int (*b) (....);" The solution seems to be to recognise the case where an arithmetic operator (including "=") precedes the open parenthesis. This is what the following patch does. Would you please try out this patch on real code, and let me know whether the problem is completely fixed, and if not, what's still going wrong. Thanks! After applying the patch, plese recompile all of CC Mode, since the change is partly in Lisp macros, which need to propagate to other files. Here's the patch: diff -r 9ff65a2d07bd cc-fonts.el --- a/cc-fonts.el Sun Sep 11 20:46:35 2016 +0000 +++ b/cc-fonts.el Tue Sep 13 18:22:17 2016 +0000 @@ -1310,6 +1310,13 @@ ;; multiline declaration. (c-put-char-property (1- match-pos) 'c-type 'c-decl-arg-start)) + ;; Got an open paren preceded by an arith operator. + ((and (eq (char-before match-pos) ?\() + (save-excursion + (and (zerop (c-backward-token-2 2)) + (looking-at c-arithmetic-op-regexp)))) + (setq context nil + c-restricted-<>-arglists nil)) (t (setq context 'arglist c-restricted-<>-arglists t)))) diff -r 9ff65a2d07bd cc-langs.el --- a/cc-langs.el Sun Sep 11 20:46:35 2016 +0000 +++ b/cc-langs.el Tue Sep 13 18:22:17 2016 +0000 @@ -1231,6 +1231,22 @@ (c-lang-defvar c-assignment-op-regexp (c-lang-const c-assignment-op-regexp)) +(c-lang-defconst c-arithmetic-operators + "List of all arithmetic operators, including \"+=\", etc." + ;; Note: in the following, there are too many operators for AWK and IDL. + t (append (c-lang-const c-assignment-operators) + '("+" "-" "*" "/" "%" + "<<" ">>" + "<" ">" "<=" ">=" + "==" "!=" + "&" "^" "|" + "&&" "||"))) + +(c-lang-defconst c-arithmetic-op-regexp + t (c-make-keywords-re nil + (c-lang-const c-arithmetic-operators))) +(c-lang-defvar c-arithmetic-op-regexp (c-lang-const c-arithmetic-op-regexp)) + (c-lang-defconst c-:$-multichar-token-regexp ;; Regexp matching all tokens ending in ":" which are longer than one char. ;; Currently (2016-01-07) only used in C++ Mode. -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 13 16:24:49 2016 Received: (at 24377) by debbugs.gnu.org; 13 Sep 2016 20:24:49 +0000 Received: from localhost ([127.0.0.1]:58933 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bjuG9-0002e2-CV for submit@debbugs.gnu.org; Tue, 13 Sep 2016 16:24:49 -0400 Received: from mail-wm0-f47.google.com ([74.125.82.47]:38047) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bjuG7-0002do-47 for 24377@debbugs.gnu.org; Tue, 13 Sep 2016 16:24:47 -0400 Received: by mail-wm0-f47.google.com with SMTP id 1so222235461wmz.1 for <24377@debbugs.gnu.org>; Tue, 13 Sep 2016 13:24:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=Y42GASiufARZb2VxCz9Mffe7MYa+X21Izr+pfx7VHYw=; b=SfpwSD1QdzKdbxIXk0PwPKJsimpZO74FTha1HJgXmng3gPUcPblgEjuqXSUIwy0x4I 41iYuGFZCb+3YuCWdfFEegrQyBtOKhe0mupDTnZyy4e5HW8nR0FGtsUhmOc4ruielc49 nTIVR3eEdwysesbzZWxLrOZvJo0t1LHpznhXdII4jzOWo+fXGx/nnXH4lv8VFxAYKWc1 GqLQ4QtlWgjnHnR5wTKQG4fIvsU6iIHWjxOZCykBvpNQZsKqOe8OOEwI/Hw15v15kN2/ yD6NOaBbiQzRqk8P+4ZWgWsv/zzA0Po3tT3uPuhGul8pfWp0FF9vxCXaYkTh+hbGFRLd UaHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=Y42GASiufARZb2VxCz9Mffe7MYa+X21Izr+pfx7VHYw=; b=fGBDadqbT4Hb/n2cYdBBR3m16q8yZsWBM08xk8EJ79aUEoPIh1mw2CEeKMBTeeoH7t +IuK4EGdUQ8tDpozqJPyv/RK5+/C2NikIIfesXPGQD+vfOq3ml8lApyK+BhJC3QUDYZ7 IgMsI0Lf4YHMJFX5Oa5axh07RA2iPV8kKZxUpgMmFZVC6ZMHxhR6mFB9vOq9GUnyIWh9 qWMjHyUWBNtPwkK5iR8YTv2J0Du3h4Ldi4ijR4hcfbzVOVACWh9QJOHJp4CwSyvUlMkZ RuI4w91QUQxtpW6ONNpE4Wir6RbWpvz+gPYmK0rerAirfl0Mo8A7EFqZvL5oz9KwcUvG oA8w== X-Gm-Message-State: AE9vXwMbcYgaMpaQPJdqPKvDlS8/h+gGtTMgoby7WvUf7WqWCEvnnc7TyWSde33tDE0QXBgN3mrfGPQ7zUW0Rw== X-Received: by 10.194.103.3 with SMTP id fs3mr22142352wjb.115.1473798281388; Tue, 13 Sep 2016 13:24:41 -0700 (PDT) MIME-Version: 1.0 Received: by 10.28.22.201 with HTTP; Tue, 13 Sep 2016 13:24:40 -0700 (PDT) In-Reply-To: <20160913183514.30625.qmail@mail.muc.de> References: <20160913183514.30625.qmail@mail.muc.de> From: Bastian Beischer Date: Tue, 13 Sep 2016 22:24:40 +0200 Message-ID: Subject: Re: bug#24377: 25.1; CC-Mode (C++) uses font-lock-type-face for ordinary variable To: Alan Mackenzie Content-Type: text/plain; charset=UTF-8 X-Spam-Score: -0.2 (/) X-Debbugs-Envelope-To: 24377 Cc: 24377@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.2 (/) Hello Alan, First of all, thanks for the patch - it's appreciated. My comments below: Alan Mackenzie writes: > Hello, Bastian. > > In article you wrote: > >> This piece of C++ code is wrongly fontified by CC-Mode: > >> int b = 5; >> int a = (b*3); > >> Reproduce as follows: > >> 1) emacs -Q >> 2) Open file "test.C" >> 3) Paste snippet in buffer >> 4) Place cursor over "b" in second line >> 5) M-x describe-face -> font-lock-type-face > >> This appears to be correlated with the presence of the opening >> parentheses and the '*' character, because: > >> 1) int a = b*3; >> does not have this problem > >> 2) "b" gets fontified incorrectly after entering the '*' character: >> int a = (b* > > Thanks for this bug report, and thanks even more for taking the trouble > to reduce the test case to just two lines. > >> In GNU Emacs 25.1.2 (x86_64-unknown-linux-gnu, GTK+ Version 2.24.30) >> of 2016-08-30 built on beischer-w520 >> Repository revision: 17197d0ae9eac100b56078b2a48964b29710b76e >> Windowing system distributor 'The X.Org Foundation', version 11.0.11804000 >> Configured using: >> 'configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib >> --localstatedir=/var --mandir=/usr/share/man --with-gameuser=:games >> --with-sound=alsa --with-xft --with-modules --with-x-toolkit=gtk2 >> --with-gconf --without-gsettings 'CFLAGS=-march=native -O2 -pipe >> -fstack-protector-strong' CPPFLAGS=-D_FORTIFY_SOURCE=2 >> LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro' > > [ .... ] > > Yes, the CC Mode fontification code was confusing the "*" with an > indirection operator, such as you might get in "int (*b) (....);" > > The solution seems to be to recognise the case where an arithmetic > operator (including "=") precedes the open parenthesis. This is what the > following patch does. Would you please try out this patch on real code, > and let me know whether the problem is completely fixed, and if not, > what's still going wrong. Thanks! > Yes this helps in the example above, but I'm not sure this is a fully correct solution. One can write something like this: void f(int arg) { printf("%d\n", arg) } f(a*5); Another example: int d(a*5) In both cases a is also wrongly fontified (and still is after applying the patch). > After applying the patch, plese recompile all of CC Mode, since the > change is partly in Lisp macros, which need to propagate to other files. > > Here's the patch: > Thanks a lot again! On Tue, Sep 13, 2016 at 8:35 PM, Alan Mackenzie wrote: > Hello, Bastian. > > In article you wrote: > >> This piece of C++ code is wrongly fontified by CC-Mode: > >> int b = 5; >> int a = (b*3); > >> Reproduce as follows: > >> 1) emacs -Q >> 2) Open file "test.C" >> 3) Paste snippet in buffer >> 4) Place cursor over "b" in second line >> 5) M-x describe-face -> font-lock-type-face > >> This appears to be correlated with the presence of the opening >> parentheses and the '*' character, because: > >> 1) int a = b*3; >> does not have this problem > >> 2) "b" gets fontified incorrectly after entering the '*' character: >> int a = (b* > > Thanks for this bug report, and thanks even more for taking the trouble > to reduce the test case to just two lines. > >> In GNU Emacs 25.1.2 (x86_64-unknown-linux-gnu, GTK+ Version 2.24.30) >> of 2016-08-30 built on beischer-w520 >> Repository revision: 17197d0ae9eac100b56078b2a48964b29710b76e >> Windowing system distributor 'The X.Org Foundation', version 11.0.11804000 >> Configured using: >> 'configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib >> --localstatedir=/var --mandir=/usr/share/man --with-gameuser=:games >> --with-sound=alsa --with-xft --with-modules --with-x-toolkit=gtk2 >> --with-gconf --without-gsettings 'CFLAGS=-march=native -O2 -pipe >> -fstack-protector-strong' CPPFLAGS=-D_FORTIFY_SOURCE=2 >> LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro' > > [ .... ] > > Yes, the CC Mode fontification code was confusing the "*" with an > indirection operator, such as you might get in "int (*b) (....);" > > The solution seems to be to recognise the case where an arithmetic > operator (including "=") precedes the open parenthesis. This is what the > following patch does. Would you please try out this patch on real code, > and let me know whether the problem is completely fixed, and if not, > what's still going wrong. Thanks! > > After applying the patch, plese recompile all of CC Mode, since the > change is partly in Lisp macros, which need to propagate to other files. > > Here's the patch: > > > > diff -r 9ff65a2d07bd cc-fonts.el > --- a/cc-fonts.el Sun Sep 11 20:46:35 2016 +0000 > +++ b/cc-fonts.el Tue Sep 13 18:22:17 2016 +0000 > @@ -1310,6 +1310,13 @@ > ;; multiline declaration. > (c-put-char-property (1- match-pos) > 'c-type 'c-decl-arg-start)) > + ;; Got an open paren preceded by an arith operator. > + ((and (eq (char-before match-pos) ?\() > + (save-excursion > + (and (zerop (c-backward-token-2 2)) > + (looking-at c-arithmetic-op-regexp)))) > + (setq context nil > + c-restricted-<>-arglists nil)) > (t (setq context 'arglist > c-restricted-<>-arglists t)))) > > diff -r 9ff65a2d07bd cc-langs.el > --- a/cc-langs.el Sun Sep 11 20:46:35 2016 +0000 > +++ b/cc-langs.el Tue Sep 13 18:22:17 2016 +0000 > @@ -1231,6 +1231,22 @@ > (c-lang-defvar c-assignment-op-regexp > (c-lang-const c-assignment-op-regexp)) > > +(c-lang-defconst c-arithmetic-operators > + "List of all arithmetic operators, including \"+=\", etc." > + ;; Note: in the following, there are too many operators for AWK and IDL. > + t (append (c-lang-const c-assignment-operators) > + '("+" "-" "*" "/" "%" > + "<<" ">>" > + "<" ">" "<=" ">=" > + "==" "!=" > + "&" "^" "|" > + "&&" "||"))) > + > +(c-lang-defconst c-arithmetic-op-regexp > + t (c-make-keywords-re nil > + (c-lang-const c-arithmetic-operators))) > +(c-lang-defvar c-arithmetic-op-regexp (c-lang-const c-arithmetic-op-regexp)) > + > (c-lang-defconst c-:$-multichar-token-regexp > ;; Regexp matching all tokens ending in ":" which are longer than one char. > ;; Currently (2016-01-07) only used in C++ Mode. > > > > -- > Alan Mackenzie (Nuremberg, Germany). > -- Bastian Beischer RWTH Aachen University of Technology @CERN Office: Bdg 32-4-B12 Phone: +41-22-76-75750 E-mail: bastian.beischer@cern.ch Address: CERN, CH-1211 Geneve 23 @RWTH Aachen Office: 28 C 203 Phone: +49-241-80-27205 E-mail: beischer@physik.rwth-aachen.de Address: I. Physikalisches Institut B, Sommerfeldstr. 14, D-52074 Aachen From debbugs-submit-bounces@debbugs.gnu.org Thu Dec 29 10:50:28 2016 Received: (at 24377-done) by debbugs.gnu.org; 29 Dec 2016 15:50:28 +0000 Received: from localhost ([127.0.0.1]:59264 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cMcyJ-0005S0-Vi for submit@debbugs.gnu.org; Thu, 29 Dec 2016 10:50:28 -0500 Received: from ocolin.muc.de ([193.149.48.4]:22543 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1cMcyH-0005Rl-LZ for 24377-done@debbugs.gnu.org; Thu, 29 Dec 2016 10:50:26 -0500 Received: (qmail 75054 invoked by uid 3782); 29 Dec 2016 15:50:24 -0000 Received: from acm.muc.de (p548C6C46.dip0.t-ipconnect.de [84.140.108.70]) by colin.muc.de (tmda-ofmipd) with ESMTP; Thu, 29 Dec 2016 16:50:24 +0100 Received: (qmail 16546 invoked by uid 1000); 29 Dec 2016 15:50:04 -0000 Date: Thu, 29 Dec 2016 15:50:04 +0000 To: Bastian Beischer Subject: Re: bug#24377: 25.1; CC-Mode (C++) uses font-lock-type-face for ordinary variable Message-ID: <20161229155004.GC12532@acm.fritz.box> References: <20160913183514.30625.qmail@mail.muc.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -3.2 (---) X-Debbugs-Envelope-To: 24377-done Cc: 24377-done@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.2 (---) Hello, Bastian. On Tue, Sep 13, 2016 at 10:24:40PM +0200, Bastian Beischer wrote: > Hello Alan, > First of all, thanks for the patch - it's appreciated. My comments > below: > Alan Mackenzie writes: > > In article you wrote: > >> This piece of C++ code is wrongly fontified by CC-Mode: > >> int b = 5; > >> int a = (b*3); > >> Reproduce as follows: > >> 1) emacs -Q > >> 2) Open file "test.C" > >> 3) Paste snippet in buffer > >> 4) Place cursor over "b" in second line > >> 5) M-x describe-face -> font-lock-type-face > >> This appears to be correlated with the presence of the opening > >> parentheses and the '*' character, because: > >> 1) int a = b*3; > >> does not have this problem > >> 2) "b" gets fontified incorrectly after entering the '*' character: > >> int a = (b* > > Thanks for this bug report, and thanks even more for taking the trouble > > to reduce the test case to just two lines. > >> In GNU Emacs 25.1.2 (x86_64-unknown-linux-gnu, GTK+ Version 2.24.30) > >> of 2016-08-30 built on beischer-w520 > >> Repository revision: 17197d0ae9eac100b56078b2a48964b29710b76e > >> Windowing system distributor 'The X.Org Foundation', version 11.0.11804000 > >> Configured using: > >> 'configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib > >> --localstatedir=/var --mandir=/usr/share/man --with-gameuser=:games > >> --with-sound=alsa --with-xft --with-modules --with-x-toolkit=gtk2 > >> --with-gconf --without-gsettings 'CFLAGS=-march=native -O2 -pipe > >> -fstack-protector-strong' CPPFLAGS=-D_FORTIFY_SOURCE=2 > >> LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro' > > [ .... ] > > Yes, the CC Mode fontification code was confusing the "*" with an > > indirection operator, such as you might get in "int (*b) (....);" > > The solution seems to be to recognise the case where an arithmetic > > operator (including "=") precedes the open parenthesis. This is what the > > following patch does. Would you please try out this patch on real code, > > and let me know whether the problem is completely fixed, and if not, > > what's still going wrong. Thanks! > Yes this helps in the example above, but I'm not sure this is a fully > correct solution. One can write something like this: > void f(int arg) { > printf("%d\n", arg) > } > f(a*5); > Another example: > int d(a*5) > In both cases a is also wrongly fontified (and still is after applying > the patch). Sorry, but in the end I wasn't able to fix this problem. There is now just too much ambiguity in C++'s syntax. The "int d(a*5)" is a sort of special case variant of "int d(a*b)". This could either be a declaration of d which is initialised to a*b, or the declaration of a function d taking one parameter b whose type is a pointer to a. C++ Mode, being an almost purely syntactic editor has no way to resolve these ambiguities. It seems not really worthwhile to handle the special case of a literal integer following the "*". So I have left that construct being fontified as the function declaration, which is probably the more common case. So, I have committed the patch as it was when I last sent it to you for review in September, and I am closing this bug. Sorry, again. > Thanks a lot again! > -- > Bastian Beischer > RWTH Aachen University of Technology -- Alan Mackenzie (Nuremberg, Germany). From unknown Sat Aug 09 04:56:35 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Fri, 27 Jan 2017 12:24:04 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator