From debbugs-submit-bounces@debbugs.gnu.org Wed Sep 18 22:45:36 2013 Received: (at submit) by debbugs.gnu.org; 19 Sep 2013 02:45:36 +0000 Received: from localhost ([127.0.0.1]:47898 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VMUFL-0008OE-4j for submit@debbugs.gnu.org; Wed, 18 Sep 2013 22:45:35 -0400 Received: from eggs.gnu.org ([208.118.235.92]:39557) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VMUFH-0008O0-Oe for submit@debbugs.gnu.org; Wed, 18 Sep 2013 22:45:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VMUF2-0008Te-Sq for submit@debbugs.gnu.org; Wed, 18 Sep 2013 22:45:26 -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,T_FREEMAIL_DOC_PDF autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:51064) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VMUF2-0008TY-Oe for submit@debbugs.gnu.org; Wed, 18 Sep 2013 22:45:16 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41251) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VMUEv-0006bL-5j for bug-gnu-emacs@gnu.org; Wed, 18 Sep 2013 22:45:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VMUEn-00083f-QR for bug-gnu-emacs@gnu.org; Wed, 18 Sep 2013 22:45:09 -0400 Received: from mail-ie0-f170.google.com ([209.85.223.170]:38113) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VMUEn-000819-Gd for bug-gnu-emacs@gnu.org; Wed, 18 Sep 2013 22:45:01 -0400 Received: by mail-ie0-f170.google.com with SMTP id x13so14427975ief.1 for ; Wed, 18 Sep 2013 19:44:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:content-type:subject:message-id:date:to:mime-version; bh=9wYeWvOOxFFtCjuGquBtEOW9pC9QL4+seSopROv0XZM=; b=RxKhPGHFg3QhjfurjEpDIGJBKoToUfMRU+5NDVJATMr8Xhp5VgdH+m+yDV75yR1alT 3eO4mg9UHj2gBCcORokjyOMdCdLiUpeJcUHxmBPaquScEyvmbwSroe1E84cjL58E1Ros vbzLC/eJsLeSw/KR1C8KVCIMmp1Jk/Iu8Apsx26dQPzy7anQtGsN7WxEIIu01AGpvYkK 5nUK3QTRcB6VhXvcdnEr53MEPZHmpAroMzWtVeIphDXROGOdkxjShC+oho1r9w5eL646 pfIyqen0dvn7p1Xv4c0RxfOBJ/vhgnDAA+ZiAHGmrqjHI+wXoJgIcXfEkaHuzYkkeRdZ SnIg== X-Received: by 10.42.98.76 with SMTP id r12mr556384icn.59.1379558685605; Wed, 18 Sep 2013 19:44:45 -0700 (PDT) Received: from [192.168.0.5] (75-166-173-180.hlrn.qwest.net. [75.166.173.180]) by mx.google.com with ESMTPSA id y10sm1521881igl.4.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 18 Sep 2013 19:44:45 -0700 (PDT) From: Ivan Andrus Content-Type: multipart/mixed; boundary="Apple-Mail=_6E14709C-A77C-4714-8CA0-EB271048A1DF" Subject: 24.3.50; c++-mode fontification for constructors is inconsistent Message-Id: Date: Wed, 18 Sep 2013 20:44:39 -0600 To: bug-gnu-emacs@gnu.org Mime-Version: 1.0 (Mac OS X Mail 6.6 \(1510\)) X-Mailer: Apple Mail (2.1510) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). 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.15 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 (----) --Apple-Mail=_6E14709C-A77C-4714-8CA0-EB271048A1DF Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Font locking of C++ constructors is somewhat inconsistent. This is no doubt complicated by the fact that unlike other function declarations they "don't have a return type". When a single argument is not used but named, the constructor is not fontified (normally it's fontified with `font-lock-function-name-face'). If the keyword explicit is used, then the argument type is fontified as a variable, and the constructor name is fontified as a type. Perhaps interestingly, naming the parameter or adding another parameter causes fontification to work correctly (with or without explicit). I have included a sample file below with comments on what I see in = `emacs -q` class Bob { // string is `font-lock-type-face', Bob is = `font-lock-function-name-face' Bob( string bob ); // string and Bob are not fontified (though I sometimes see string = fontified as a type) Bob( string ); // string is `font-lock-variable-name-face', Bob is = `font-lock-type-face' explicit Bob( string ); // string is `font-lock-type-face', Bob is = `font-lock-function-name-face' explicit Bob( string, string ); }; --Apple-Mail=_6E14709C-A77C-4714-8CA0-EB271048A1DF Content-Disposition: inline; filename=constructors.pdf Content-Type: application/pdf; x-unix-mode=0644; name="constructors.pdf" Content-Transfer-Encoding: base64 JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmlsdGVyIC9G bGF0ZURlY29kZSA+PgpzdHJlYW0KeAErVAhUKFTQD0gtSk4tKClNzFEoygQKmJpYKhgAoZGhEZhO zlXQ98w1VHDJB6oPBACVLA32CmVuZHN0cmVhbQplbmRvYmoKNSAwIG9iago1NAplbmRvYmoKMiAw IG9iago8PCAvVHlwZSAvUGFnZSAvUGFyZW50IDMgMCBSIC9SZXNvdXJjZXMgNiAwIFIgL0NvbnRl bnRzIDQgMCBSIC9NZWRpYUJveCBbMCAwIDU0OSAyMTJdCj4+CmVuZG9iago2IDAgb2JqCjw8IC9Q cm9jU2V0IFsgL1BERiAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdIC9YT2JqZWN0IDw8IC9JbTEg NyAwIFIgPj4gPj4KZW5kb2JqCjcgMCBvYmoKPDwgL0xlbmd0aCA4IDAgUiAvVHlwZSAvWE9iamVj dCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDU0OSAvSGVpZ2h0IDIxMiAvQ29sb3JTcGFjZQo5IDAg UiAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Aex9 308bSbY/T/tn8JhHHhCal3kYIYQijbRiQCutNiJStKsMaLU711E0c2Vpb67CRit5lVwZZTJGJCGT CbkMJBl+7GVgIExIPB6I19gMOGD8tT2OA4a0YzzQQDtuM/6e+tGmu13tX0BCkrIs6K4+XeecT52q U+dUdTuT4R+OAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeA I8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGO AEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgC HIHXg8BWILj0gz/wgz+2nn49Eui5SoHw7FNJ1hfzc44AR4AjwBF4kxFY+fpe57GLV45dHHssHqIe qdlTHbWV9NtwwemSjJhJrvc6ai8EE0bXeTlHgCPAEeAIvKkIyOGvjl383n247uZ3HbVnna6nz/3f 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 2j6S1qJOkO53/UxDHqMOEw8zWvNOS5IV2jrHFtiF2r9ytHLqhfektoPqbj3uVh6zhFgig3e1r5Jf D8kiYCqIGLwWeiScldwUuT9qNeZMnHkClNiWTEzZOZKXxpFelSlztCvLIXsj90peyEmp/PFTAYVf iqKKv52JKd0uz6xgqaw9r1k1XhNcS3Oxrt700tLl3CtKTW+unm8JumHYKtSO6ljqHO3u6mnsreov vVf4IH/gxNCJ4ZyRpDH3J3IT36auPQt+Ifny7fSFGd85qfm1hc53GUuG79dWjn34/MlsNXet9fOr LytfN7/Nf3+4XrCxb+PtZvrm5o+QH/NbB7Zub7Nsk7a7f7L8JP3s3qHasdkp2Xm9K74buttKiX+E r6ICZfcAEJ0+XH6c3t39IgYAtgCAn/m7u1tVu7s/q+HDxksAeoL++t+FQsbAtfpzaAp6yDt/mHL/ 9+d/AIVc2UkKZW5kc3RyZWFtCmVuZG9iagoxMSAwIG9iago2MTY1CmVuZG9iago5IDAgb2JqClsg L0lDQ0Jhc2VkIDEwIDAgUiBdCmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvTWVkaWFC b3ggWzAgMCA2MTIgNzkyXSAvQ291bnQgMSAvS2lkcyBbIDIgMCBSIF0gPj4KZW5kb2JqCjEyIDAg b2JqCjw8IC9UeXBlIC9DYXRhbG9nIC9QYWdlcyAzIDAgUiA+PgplbmRvYmoKMTMgMCBvYmoKKE1h YyBPUyBYIDEwLjguNSBRdWFydHogUERGQ29udGV4dCkKZW5kb2JqCjE0IDAgb2JqCihEOjIwMTMw OTE5MDExNTI4WjAwJzAwJykKZW5kb2JqCjEgMCBvYmoKPDwgL1Byb2R1Y2VyIDEzIDAgUiAvQ3Jl YXRpb25EYXRlIDE0IDAgUiAvTW9kRGF0ZSAxNCAwIFIgPj4KZW5kb2JqCnhyZWYKMCAxNQowMDAw MDAwMDAwIDY1NTM1IGYgCjAwMDAwMzI1NzIgMDAwMDAgbiAKMDAwMDAwMDE2OCAwMDAwMCBuIAow MDAwMDMyMzQ1IDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwMDE1MCAwMDAwMCBu IAowMDAwMDAwMjcyIDAwMDAwIG4gCjAwMDAwMDAzNjEgMDAwMDAgbiAKMDAwMDAyNTk5OSAwMDAw MCBuIAowMDAwMDMyMzA5IDAwMDAwIG4gCjAwMDAwMjYwMjAgMDAwMDAgbiAKMDAwMDAzMjI4OCAw MDAwMCBuIAowMDAwMDMyNDI4IDAwMDAwIG4gCjAwMDAwMzI0NzggMDAwMDAgbiAKMDAwMDAzMjUz MCAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDE1IC9Sb290IDEyIDAgUiAvSW5mbyAxIDAgUiAv SUQgWyA8MDRkNWE2YWY5YjZkNDJhM2I4NGYzMjc3NmE5ZmIxM2Y+CjwwNGQ1YTZhZjliNmQ0MmEz Yjg0ZjMyNzc2YTlmYjEzZj4gXSA+PgpzdGFydHhyZWYKMzI2NDcKJSVFT0YK --Apple-Mail=_6E14709C-A77C-4714-8CA0-EB271048A1DF Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii Thanks, Ivan In GNU Emacs 24.3.50.1 (i386-apple-darwin12.5.0, NS apple-appkit-1187.39) of 2013-09-16 on ivanandres-MacBookPro Bzr revision: 114309 rgm@gnu.org-20130916192145-tr5qrfdmhcq3a563 Windowing system distributor `Apple', version 10.3.1187 Configured using: `configure --with-ns --with-xml2' Important settings: locale-coding-system: nil default enable-multibyte-characters: t Major mode: C++/lah Minor modes in effect: diff-auto-refine-mode: t eldoc-mode: t highlight-parentheses-mode: t hl-sexp-mode: t highlight-symbol-mode: t which-function-mode: t show-paren-mode: t msb-mode: t minibuffer-depth-indicate-mode: t global-hl-line-mode: t delete-selection-mode: t auto-image-file-mode: t auto-insert-mode: t yas-global-mode: t yas-minor-mode: t shell-dirtrack-mode: t ido-everywhere: t global-visible-mark-mode: t visible-mark-mode: t gvol-mode: t recentf-mode: t desktop-save-mode: t drag-stuff-global-mode: t drag-stuff-mode: t tooltip-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 column-number-mode: t line-number-mode: t transient-mark-mode: t abbrev-mode: t --Apple-Mail=_6E14709C-A77C-4714-8CA0-EB271048A1DF-- From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 29 23:31:22 2013 Received: (at 15415) by debbugs.gnu.org; 30 Sep 2013 03:31:22 +0000 Received: from localhost ([127.0.0.1]:45394 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VQUCf-0003ah-Kr for submit@debbugs.gnu.org; Sun, 29 Sep 2013 23:31:21 -0400 Received: from mail-ie0-f175.google.com ([209.85.223.175]:55749) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VQUCb-0003aV-0C for 15415@debbugs.gnu.org; Sun, 29 Sep 2013 23:31:19 -0400 Received: by mail-ie0-f175.google.com with SMTP id e14so8764722iej.20 for <15415@debbugs.gnu.org>; Sun, 29 Sep 2013 20:31:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:content-type:content-transfer-encoding:subject:message-id:date :to:mime-version; bh=1VeMA0u1LesaadDG4NQdd10SUmP33Igw77AqzTkCwLs=; b=HZVV4WEFwZf4KhNZI8Kstd9lnyNgplAQaMXp8CO8b3QlbCLickZnW62LuaKMtUkoye 2Ru5gjVd69UcoqXo7+kBznRK0vfZQeTc0/ApNxTzLPvFnbbPEFYGIPx/THpFcwuV0RWg rYzv+of09hGdA2Y8Jydjb6C8bMfyJ9OHo9R7ZfvrVKTMJC+qCHurqgAi5m+kNIvM1+8+ QnjG6LVyOYxitX7ETQqZrwbyIZSiFFumHfOTuvZEvox72RrzFiuksnrrv/eEFSf5fNeL UEOOlekRmwEXWCI3baV7JLUNJbx6a93EQY+qwNAKXKJMHdh9/Vq9YM8q/Y1W35hRbPda 2lDQ== X-Received: by 10.43.154.18 with SMTP id lc18mr2961533icc.41.1380511875930; Sun, 29 Sep 2013 20:31:15 -0700 (PDT) Received: from [192.168.0.5] (75-166-179-178.hlrn.qwest.net. [75.166.179.178]) by mx.google.com with ESMTPSA id ka5sm14527469igb.2.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 29 Sep 2013 20:31:14 -0700 (PDT) From: Ivan Andrus Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Subject: Re: bug#15415: 24.3.50; c++-mode fontification for constructors is inconsistent Message-Id: <160417FD-FE6F-4C7F-AEC5-CEFD09ABE113@gmail.com> Date: Sun, 29 Sep 2013 21:31:13 -0600 To: 15415@debbugs.gnu.org Mime-Version: 1.0 (Mac OS X Mail 6.6 \(1510\)) X-Mailer: Apple Mail (2.1510) X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 15415 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 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.7 (/) Ivan Andrus writes: > Font locking of C++ constructors is somewhat inconsistent. This is no > doubt complicated by the fact that unlike other function declarations > they "don't have a return type". > > When a single argument is not used but named, the constructor is not > fontified (normally it's fontified with = `font-lock-function-name-face'). > If the keyword explicit is used, then the argument type is fontified = as > a variable, and the constructor name is fontified as a type. Perhaps > interestingly, naming the parameter or adding another parameter causes > fontification to work correctly (with or without explicit). > > I have included a sample file below with comments on what I see in = `emacs -q` > > > class Bob > { > // string is `font-lock-type-face', Bob is = `font-lock-function-name-face' > Bob( string bob ); > // string and Bob are not fontified (though I sometimes see string = fontified as a type) > Bob( string ); > // string is `font-lock-variable-name-face', Bob is = `font-lock-type-face' > explicit Bob( string ); > // string is `font-lock-type-face', Bob is = `font-lock-function-name-face' > explicit Bob( string, string ); > }; In fact, it's not just constructors that have this problem. For example the following function declaration: string lookup( size_t ) const; Removing const, or adding a name to the size_t parameter causes fontification to work correctly. -Ivan From debbugs-submit-bounces@debbugs.gnu.org Sat Oct 12 16:47:46 2013 Received: (at 15415) by debbugs.gnu.org; 12 Oct 2013 20:47:46 +0000 Received: from localhost ([127.0.0.1]:44689 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VV66D-0003sQ-Ny for submit@debbugs.gnu.org; Sat, 12 Oct 2013 16:47:46 -0400 Received: from colin.muc.de ([193.149.48.1]:55026 helo=mail.muc.de) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VV669-0003sG-RW for 15415@debbugs.gnu.org; Sat, 12 Oct 2013 16:47:43 -0400 Received: (qmail 11722 invoked by uid 3782); 12 Oct 2013 20:47:39 -0000 Received: from acm.muc.de (p5492CE06.dip0.t-ipconnect.de [84.146.206.6]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sat, 12 Oct 2013 22:47:38 +0200 Received: (qmail 3917 invoked by uid 1000); 12 Oct 2013 20:45:43 -0000 Date: Sat, 12 Oct 2013 20:45:43 +0000 To: Ivan Andrus Subject: Re: bug#15415: 24.3.50; c++-mode fontification for constructors is inconsistent Message-ID: <20131012204542.GA3690@acm.acm> References: <160417FD-FE6F-4C7F-AEC5-CEFD09ABE113@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <160417FD-FE6F-4C7F-AEC5-CEFD09ABE113@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.9 (/) X-Debbugs-Envelope-To: 15415 Cc: 15415@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 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.9 (/) Hello, Ivan. On Sun, Sep 29, 2013 at 09:31:13PM -0600, Ivan Andrus wrote: > Ivan Andrus writes: > > Font locking of C++ constructors is somewhat inconsistent. This is > > no doubt complicated by the fact that unlike other function > > declarations they "don't have a return type". This is, indeed, problematic. > > When a single argument is not used but named, the constructor is not > > fontified (normally it's fontified with > > `font-lock-function-name-face'). If the keyword explicit is used, > > then the argument type is fontified as a variable, and the > > constructor name is fontified as a type. Perhaps interestingly, > > naming the parameter or adding another parameter causes fontification > > to work correctly (with or without explicit). Yes. The pertinent function, `c-forward-decl-or-cast-1', is somewhat probablistic. If it gets sufficient clues from the context, it gets things right, otherwise it has to guess, and sometimes will get things wrong, particularly in C++, which doesn't have a nice context-free syntax. > > I have included a sample file below with comments on what I see in > > `emacs -q` > > class Bob > > { > > // string is `font-lock-type-face', Bob is `font-lock-function-name-face' 1 > > Bob( string bob ); > > // string and Bob are not fontified (though I sometimes see string fontified as a type) 2 > > Bob( string ); > > // string is `font-lock-variable-name-face', Bob is `font-lock-type-face' 3 > > explicit Bob( string ); > > // string is `font-lock-type-face', Bob is `font-lock-function-name-face' 4 > > explicit Bob( string, string ); > > }; > In fact, it's not just constructors that have this problem. For > example the following function declaration: 5 > string lookup( size_t ) const; > Removing const, or adding a name to the size_t parameter causes > fontification to work correctly. Yes. Of the lines of code you've illustrated, 1 and 4 were OK. I've corrected 3 and 5, which were relatively simple. 2 is a problem, because it looks like a normal function call. If the identifier in the parentheses (here "string") can be positively identified as a type (for example, some use elsewhere can only be a type, or it's a standard type like "string") it gets fontified. Otherwise, it's assumed the construct is a function call. It would no doubt be possible to check that the enclosing braces are a class declaration, and that "Bob" is the name of the class, but this would slow down the fontification, probably by a lot. Would you please try out the patch below, and let me know how it goes. It is based on the current source in the bzr trunk. Again, thanks for such a crisp and concise bug report. === modified file 'lisp/progmodes/cc-engine.el' *** lisp/progmodes/cc-engine.el 2013-09-28 17:17:01 +0000 --- lisp/progmodes/cc-engine.el 2013-10-12 20:18:26 +0000 *************** *** 6917,6923 **** ;; 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) (goto-char id-start) --- 6917,6925 ---- ;; 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 ! ;; Start of the identifier for which `got-identifier' was set. ! name-start) (goto-char id-start) *************** *** 6935,6941 **** ;; 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)) (if (looking-at "\\(::\\)") ;; We only check for a trailing "::" and ;; let the "*" that should follow be --- 6937,6945 ---- ;; 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 (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,6967 **** ;; Skip over an identifier. (or got-identifier (and (looking-at c-identifier-start) ! (setq got-identifier (c-forward-name)))) ;; Skip over type decl suffix operators. (while (if (looking-at c-type-decl-suffix-key) --- 6965,6973 ---- ;; Skip over an identifier. (or got-identifier (and (looking-at c-identifier-start) ! (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,7074 **** ;; 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. (if backup-at-type (progn --- 7058,7084 ---- ;; 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 ! (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 > -Ivan -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Fri Oct 18 18:01:00 2013 Received: (at 15415) by debbugs.gnu.org; 18 Oct 2013 22:01:00 +0000 Received: from localhost ([127.0.0.1]:57290 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VXI6M-00034w-7t for submit@debbugs.gnu.org; Fri, 18 Oct 2013 18:00:59 -0400 Received: from mail-pd0-f169.google.com ([209.85.192.169]:36459) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VXI6F-00034e-LW for 15415@debbugs.gnu.org; Fri, 18 Oct 2013 18:00:53 -0400 Received: by mail-pd0-f169.google.com with SMTP id q10so3801213pdj.28 for <15415@debbugs.gnu.org>; Fri, 18 Oct 2013 15:00:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=vJMjR0P+XPJIabp7mQgFC+K/FmVsXLGsEE+Dx0uBejY=; b=c6ZGuqD+FN12AARRgXE+oJfm+1o8OWUzKenLoPAEYP+Ti0r4dQfNZms+tOxce5v1ig D3FazO+pIhA7EJVyvyTPDKCn6LDf63bL3WMTEy80q0+N7zBlcDhirUA6rejWtJKZ8I6f njbJBHbyQ5i42oyJtwQ4iIqoSd92RwzP+2avY5VhFlcI7RGYjYx+gqCGn53AojdL46bg Tcxb+YO4nx7FNIPTWi0kXpl9zBt/ZLFlvwEF3E3b90TBC9/pIiHK5B/lHsOh3lj/V3oz XC8OiybJF/5RfaLRhBVOniOE7iw5OopOjseQoyMvv+szK9QitPNCBgWKCQOpR+OU35uw 3gmw== MIME-Version: 1.0 X-Received: by 10.66.140.40 with SMTP id rd8mr5517537pab.119.1382133645333; Fri, 18 Oct 2013 15:00:45 -0700 (PDT) Received: by 10.70.61.195 with HTTP; Fri, 18 Oct 2013 15:00:45 -0700 (PDT) In-Reply-To: <20131012204542.GA3690@acm.acm> References: <160417FD-FE6F-4C7F-AEC5-CEFD09ABE113@gmail.com> <20131012204542.GA3690@acm.acm> Date: Fri, 18 Oct 2013 16:00:45 -0600 Message-ID: Subject: Re: bug#15415: 24.3.50; c++-mode fontification for constructors is inconsistent From: Ivan Andrus To: Alan Mackenzie Content-Type: multipart/alternative; boundary=001a11331cb2f65a5404e90b1085 X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 15415 Cc: "15415@debbugs.gnu.org" <15415@debbugs.gnu.org> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 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.0 (/) --001a11331cb2f65a5404e90b1085 Content-Type: text/plain; charset=ISO-8859-1 Oops, forgot to CC the bug. I've been using the patch for a week now and haven't noticed any ill effects. Thanks, Ivan On Sat, Oct 12, 2013 at 2:45 PM, Alan Mackenzie wrote: > Hello, Ivan. > > On Sun, Sep 29, 2013 at 09:31:13PM -0600, Ivan Andrus wrote: > > Ivan Andrus writes: > > > > Font locking of C++ constructors is somewhat inconsistent. This is > > > no doubt complicated by the fact that unlike other function > > > declarations they "don't have a return type". > > This is, indeed, problematic. > > > > When a single argument is not used but named, the constructor is not > > > fontified (normally it's fontified with > > > `font-lock-function-name-face'). If the keyword explicit is used, > > > then the argument type is fontified as a variable, and the > > > constructor name is fontified as a type. Perhaps interestingly, > > > naming the parameter or adding another parameter causes fontification > > > to work correctly (with or without explicit). > > Yes. The pertinent function, `c-forward-decl-or-cast-1', is somewhat > probablistic. If it gets sufficient clues from the context, it gets > things right, otherwise it has to guess, and sometimes will get things > wrong, particularly in C++, which doesn't have a nice context-free > syntax. > > > > I have included a sample file below with comments on what I see in > > > `emacs -q` > > > > > class Bob > > > { > > > // string is `font-lock-type-face', Bob is > `font-lock-function-name-face' > 1 > > Bob( string bob ); > > > // string and Bob are not fontified (though I sometimes see > string fontified as a type) > 2 > > Bob( string ); > > > // string is `font-lock-variable-name-face', Bob is > `font-lock-type-face' > 3 > > explicit Bob( string ); > > > // string is `font-lock-type-face', Bob is > `font-lock-function-name-face' > 4 > > explicit Bob( string, string ); > > > }; > > > In fact, it's not just constructors that have this problem. For > > example the following function declaration: > > 5 > string lookup( size_t ) const; > > > Removing const, or adding a name to the size_t parameter causes > > fontification to work correctly. > > Yes. > > Of the lines of code you've illustrated, 1 and 4 were OK. I've corrected > 3 and 5, which were relatively simple. > > 2 is a problem, because it looks like a normal function call. If the > identifier in the parentheses (here "string") can be positively > identified as a type (for example, some use elsewhere can only be a type, > or it's a standard type like "string") it gets fontified. Otherwise, > it's assumed the construct is a function call. It would no doubt be > possible to check that the enclosing braces are a class declaration, and > that "Bob" is the name of the class, but this would slow down the > fontification, probably by a lot. > > Would you please try out the patch below, and let me know how it goes. > It is based on the current source in the bzr trunk. > > Again, thanks for such a crisp and concise bug report. > > > > === modified file 'lisp/progmodes/cc-engine.el' > *** lisp/progmodes/cc-engine.el 2013-09-28 17:17:01 +0000 > --- lisp/progmodes/cc-engine.el 2013-10-12 20:18:26 +0000 > *************** > *** 6917,6923 **** > ;; 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) > > (goto-char id-start) > > --- 6917,6925 ---- > ;; 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 > ! ;; Start of the identifier for which `got-identifier' was set. > ! name-start) > > (goto-char id-start) > > *************** > *** 6935,6941 **** > ;; 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)) > (if (looking-at "\\(::\\)") > ;; We only check for a trailing "::" and > ;; let the "*" that should follow be > --- 6937,6945 ---- > ;; 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 (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,6967 **** > ;; Skip over an identifier. > (or got-identifier > (and (looking-at c-identifier-start) > ! (setq got-identifier (c-forward-name)))) > > ;; Skip over type decl suffix operators. > (while (if (looking-at c-type-decl-suffix-key) > --- 6965,6973 ---- > ;; Skip over an identifier. > (or got-identifier > (and (looking-at c-identifier-start) > ! (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,7074 **** > ;; 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. > > (if backup-at-type > (progn > > --- 7058,7084 ---- > ;; 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 > ! (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 > > > > > > > -Ivan > > -- > Alan Mackenzie (Nuremberg, Germany). > --001a11331cb2f65a5404e90b1085 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Oops,= forgot to CC the bug.

I&#= 39;ve been using the patch for a week now and haven't noticed any ill e= ffects. =A0

Thanks,
Ivan


On Sat, Oct 12, 2013 at 2:45 PM, Alan M= ackenzie <acm@muc.de> wrote:
Hello, Ivan.

On Sun, Sep 29, 2013 at 09:31:13PM -0600, Ivan Andrus wrote:
> Ivan Andrus <darthandrus@gmail.com> writes:

> > Font locking of C++ constructors is somewhat inconsistent. =A0Thi= s is
> > no doubt complicated by the fact that unlike other function
> > declarations they "don't have a return type".

This is, indeed, problematic.

> > When a single argument is not used but named, the constructor is = not
> > fontified (normally it's fontified with
> > `font-lock-function-name-face'). =A0If the keyword explicit i= s used,
> > then the argument type is fontified as a variable, and the
> > constructor name is fontified as a type. =A0Perhaps interestingly= ,
> > naming the parameter or adding another parameter causes fontifica= tion
> > to work correctly (with or without explicit).

Yes. =A0The pertinent function, `c-forward-decl-or-cast-1', is so= mewhat
probablistic. =A0If it gets sufficient clues from the context, it gets
things right, otherwise it has to guess, and sometimes will get things
wrong, particularly in C++, which doesn't have a nice context-free
syntax.

> > I have included a sample file below with comments on what I see i= n
> > `emacs -q`


=A0 > > class Bob
=A0 > > {
=A0 > > =A0 =A0 // string is `font-lock-type-face', Bob is `font-= lock-function-name-face'
1 > > =A0 =A0 Bob( string bob );
=A0 > > =A0 =A0 // string and Bob are not fontified (though I so= metimes see string fontified as a type)
2 > > =A0 =A0 Bob( string );
=A0 > > =A0 =A0 // string is `font-lock-variable-name-face',= Bob is `font-lock-type-face'
3 > > =A0 =A0 explicit Bob( string );
=A0 > > =A0 =A0 // string is `font-lock-type-face', Bob is `= font-lock-function-name-face'
4 > > =A0 =A0 explicit Bob( string, string );
=A0 > > };

> In fact, it's not just constructors that have this problem. =A0For=
> example the following function declaration:

5 > string lookup( size_t ) const;

> Removing const, or adding a name to the size_t parameter causes
> fontification to work correctly.

Yes.

Of the lines of code you've illustrated, 1 and 4 were OK. =A0I've c= orrected
3 and 5, which were relatively simple.

2 is a problem, because it looks like a normal function call. =A0If the
identifier in the parentheses (here "string") can be positively identified as a type (for example, some use elsewhere can only be a type, or it's a standard type like "string") it gets fontified. =A0= Otherwise,
it's assumed the construct is a function call. =A0It would no doubt be<= br> possible to check that the enclosing braces are a class declaration, and that "Bob" is the name of the class, but this would slow down the=
fontification, probably by a lot.

Would you please try out the patch below, and let me know how it goes.
It is based on the current source in the bzr trunk.

Again, thanks for such a crisp and concise bug report.



=3D=3D=3D modified file 'lisp/progmodes/cc-engine.el'
*** lisp/progmodes/cc-engine.el 2013-09-28 17:17:01 +0000
--- lisp/progmodes/cc-engine.el 2013-10-12 20:18:26 +0000
***************
*** 6917,6923 ****
=A0 =A0 =A0 =A0 =A0 ;; can happen since we don't know if
=A0 =A0 =A0 =A0 =A0 ;; `c-restricted-<>-arglists' will be correct= inside the
=A0 =A0 =A0 =A0 =A0 ;; arglist paren that gets entered.
! =A0 =A0 =A0 =A0 c-parse-and-markup-<>-arglists)

=A0 =A0 =A0 =A0 (goto-char id-start)

--- 6917,6925 ----
=A0 =A0 =A0 =A0 =A0 ;; can happen since we don't know if
=A0 =A0 =A0 =A0 =A0 ;; `c-restricted-<>-arglists' will be correct= inside the
=A0 =A0 =A0 =A0 =A0 ;; arglist paren that gets entered.
! =A0 =A0 =A0 =A0 c-parse-and-markup-<>-arglists
! =A0 =A0 =A0 =A0 ;; Start of the identifier for which `got-identifier'= was set.
! =A0 =A0 =A0 =A0 name-start)

=A0 =A0 =A0 =A0 (goto-char id-start)

***************
*** 6935,6941 ****
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; If the third submatch ma= tches in C++ then
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; we're looking at an = identifier that's a
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; prefix only if it specif= ies a member pointer.
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (when (setq got-identifier (c= -forward-name))
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (if (looking-at "\= \(::\\)")
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; We only chec= k for a trailing "::" and
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; let the &quo= t;*" that should follow be
--- 6937,6945 ----
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; If the third submatch ma= tches in C++ then
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; we're looking at an = identifier that's a
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; prefix only if it specif= ies a member pointer.
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (when (progn (setq pos (point= ))
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(s= etq got-identifier (c-forward-name)))
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (setq name-start pos)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (if (looking-at "\= \(::\\)")
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; We only chec= k for a trailing "::" and
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; let the &quo= t;*" that should follow be
***************
*** 6961,6967 ****
=A0 =A0 =A0 =A0 ;; Skip over an identifier.
=A0 =A0 =A0 =A0 (or got-identifier
=A0 =A0 =A0 =A0 =A0 (and (looking-at c-identifier-start)
! =A0 =A0 =A0 =A0 =A0 =A0 =A0(setq got-identifier (c-forward-name))))

=A0 =A0 =A0 =A0 ;; Skip over type decl suffix operators.
=A0 =A0 =A0 =A0 (while (if (looking-at c-type-decl-suffix-key)
--- 6965,6973 ----
=A0 =A0 =A0 =A0 ;; Skip over an identifier.
=A0 =A0 =A0 =A0 (or got-identifier
=A0 =A0 =A0 =A0 =A0 (and (looking-at c-identifier-start)
! =A0 =A0 =A0 =A0 =A0 =A0 =A0(setq pos (point))
! =A0 =A0 =A0 =A0 =A0 =A0 =A0(setq got-identifier (c-forward-name))
! =A0 =A0 =A0 =A0 =A0 =A0 =A0(setq name-start pos)))

=A0 =A0 =A0 =A0 ;; Skip over type decl suffix operators.
=A0 =A0 =A0 =A0 (while (if (looking-at c-type-decl-suffix-key)
***************
*** 7052,7074 ****
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; declaration.
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (throw 'at-decl-or-cast t))

- =A0 =A0 =A0 =A0 =A0 =A0 (when (and got-parens
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(not got-prefix)
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(not got-suffix-after-pare= ns)
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(or backup-at-type
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0maybe-typeless
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0backup-maybe-typel= ess))
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; Got a declaration of the form "foo ba= r (gnu);" where we've
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; recognized "bar" as the type and= "gnu" as the declarator.
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; In this case it's however more likely = that "bar" is the
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; declarator and "gnu" a function = argument or initializer (if
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; `c-recognize-paren-inits' is set), sin= ce the parens around
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; "gnu" would be superfluous if it= 's a declarator. =A0Shift the
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; type one step backward.
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 (c-fdoc-shift-type-backward)))

! =A0 =A0 =A0 =A0 ;; Found no identifier.

=A0 =A0 =A0 =A0 =A0 (if backup-at-type
=A0 =A0 =A0 =A0 =A0 =A0 =A0 (progn

--- 7058,7084 ----
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; declaration.
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (throw 'at-decl-or-cast t))


! =A0 =A0 =A0 =A0 =A0 =A0 =A0(when (and got-parens
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (not got-prefix)
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ;; (not got-suffix-after-= parens)
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (or backup-at-type
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 maybe-typeless ! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 backup-maybe-type= less
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (eq at-decl-or-ca= st t)
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (save-excursion ! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (goto-char na= me-start)
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (not (memq (c= -forward-type) '(nil maybe))))))
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0;; Got a declaration of the form "foo= bar (gnu);" or "bar
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0;; (gnu);" where we've recognized= "bar" as the type and "gnu"
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0;; as the declarator. =A0In this case it&#= 39;s however more likely
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0;; that "bar" is the declarator = and "gnu" a function argument
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0;; or initializer (if `c-recognize-paren-i= nits' is set),
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0;; since the parens around "gnu"= would be superfluous if it's
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0;; a declarator. =A0Shift the type one ste= p backward.
! =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(c-fdoc-shift-type-backward)))

+ =A0 =A0 =A0 =A0 =A0;; Found no identifier.
=A0 =A0 =A0 =A0 =A0 (if backup-at-type
=A0 =A0 =A0 =A0 =A0 =A0 =A0 (progn





> -Ivan

--
Alan Mackenzie (Nuremberg, Germany).

--001a11331cb2f65a5404e90b1085-- From debbugs-submit-bounces@debbugs.gnu.org Sat Oct 19 11:20:35 2013 Received: (at 15415-done) by debbugs.gnu.org; 19 Oct 2013 15:20:35 +0000 Received: from localhost ([127.0.0.1]:58024 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VXYKQ-0005qN-NE for submit@debbugs.gnu.org; Sat, 19 Oct 2013 11:20:35 -0400 Received: from colin.muc.de ([193.149.48.1]:51307 helo=mail.muc.de) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VXYKM-0005q5-Nc for 15415-done@debbugs.gnu.org; Sat, 19 Oct 2013 11:20:31 -0400 Received: (qmail 85876 invoked by uid 3782); 19 Oct 2013 15:20:29 -0000 Received: from acm.muc.de (pD951A1DC.dip0.t-ipconnect.de [217.81.161.220]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sat, 19 Oct 2013 17:20:28 +0200 Received: (qmail 13181 invoked by uid 1000); 19 Oct 2013 15:18:30 -0000 Date: Sat, 19 Oct 2013 15:18:30 +0000 To: 15415-done@debbugs.gnu.org Subject: Re: bug#15415: 24.3.50; c++-mode fontification for constructors is inconsistent Message-ID: <20131019151830.GB2991@acm.acm> References: <160417FD-FE6F-4C7F-AEC5-CEFD09ABE113@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <160417FD-FE6F-4C7F-AEC5-CEFD09ABE113@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -1.1 (-) X-Debbugs-Envelope-To: 15415-done X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 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: -1.1 (-) Bug fixed. -- Alan Mackenzie (Nuremberg, Germany). From unknown Tue Jun 24 05:08:08 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Sun, 17 Nov 2013 12:24:03 +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