Received: (at 66911) by debbugs.gnu.org; 6 Nov 2023 13:48:27 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Nov 06 08:48:27 2023 Received: from localhost ([127.0.0.1]:38905 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1qzzxq-0002eQ-K2 for submit <at> debbugs.gnu.org; Mon, 06 Nov 2023 08:48:27 -0500 Received: from mail.muc.de ([193.149.48.3]:40960) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <acm@HIDDEN>) id 1qzzxn-0002dT-Ri for 66911 <at> debbugs.gnu.org; Mon, 06 Nov 2023 08:48:24 -0500 Received: (qmail 59578 invoked by uid 3782); 6 Nov 2023 14:47:39 +0100 Received: from acm.muc.de (pd953a5e1.dip0.t-ipconnect.de [217.83.165.225]) (using STARTTLS) by colin.muc.de (tmda-ofmipd) with ESMTP; Mon, 06 Nov 2023 14:47:39 +0100 Received: (qmail 9058 invoked by uid 1000); 6 Nov 2023 13:47:39 -0000 Date: Mon, 6 Nov 2023 13:47:39 +0000 To: Arsen =?utf-8?Q?Arsenovi=C4=87?= <arsen@HIDDEN> Subject: Re: bug#66911: CC Mode 5.35.2 (C++//l); Noise macro being taken as anchor to class-open Message-ID: <ZUjuew02nbQGa8oE@ACM> References: <87zfzv16io.fsf@HIDDEN> <ZUjEJ-2D0m39qZ7W@ACM> <867cmv2iua.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <867cmv2iua.fsf@HIDDEN> X-Submission-Agent: TMDA/1.3.x (Ph3nix) From: Alan Mackenzie <acm@HIDDEN> X-Primary-Address: acm@HIDDEN X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 66911 Cc: acm@HIDDEN, 66911 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) Hello, Arsen. On Mon, Nov 06, 2023 at 12:38:36 +0100, Arsen Arsenović wrote: > Hi Alan, > Alan Mackenzie <acm@HIDDEN> writes: > > On Fri, Nov 03, 2023 at 10:51:32 +0100, Arsen Arsenović via CC-Mode-help wrote: > >> Package: cc-mode [ .... ] > > Would you please apply the patch, byte compile cc-engine.el (or all of > > CC Mode), load it into your Emacs and try it out on your real C++ code. > > The patch should apply cleanly to the Emacs master branch. Then please > > confirm that it is actually fixes the bug, or tell me what's still not > > working properly. (If you want any help applying the patch or compiling > > the file, feel free to send me private email.) > That indeed appears to have fixed it. I built emacs 30.0.50 from git > (94807b6896191245ff3bef44a0ec21efb918232f) and applied your patch, then > compared the analysis and indentation before and after on libstdc++es > <bitset>, and it worked as expected (the noise macro stopped confusing > it). Thanks! Time to commit the patch, then. > Though, the anchor still anchors on the template<> line rather than the > struct line in: > template<size_t _Nw> > struct _Base_bitset > { > ... making it impossible (AFAICT) to create a style that implements: > template<size_t _Nw> > struct _Base_bitset > { > }; > struct foo > { > }; > instead, the former gets formatted as: > template<size_t _Nw> > struct _Base_bitset > { > }; > Is this intended? Apologies. I missed this second point in your original bug report. This should be fixable, but will be more work to fix than the other point. I think something like the following would do it: we could add a second anchor point to topmost-intro-cont forms, that second point pointing at struct. In languages without templates/generics, or in constructs lacking template components, both anchor points would be the same. So you could write an alignment function which would use that second anchor point for class-open lines and the like. Or, just possibly, we might be able to make that second point the default for class-open. This should keep backward compatibility. I'll have to think about this. And of course, the manual and test programs will need amending, too. ;-) > >> Emacs : GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.38, cairo version 1.17.8) > >> of 2023-09-24 > >> Package: CC Mode 5.35.2 (C++//l) > >> Buffer Style: gnu > >> c-emacs-features: (pps-extended-state col-0-paren posix-char-classes > >> gen-string-delim gen-comment-delim syntax-properties category-properties > >> 1-bit) [ .... ] > -- > Arsen Arsenović -- Alan Mackenzie (Nuremberg, Germany).
bug-cc-mode@HIDDEN
:bug#66911
; Package cc-mode
.
Full text available.Received: (at 66911) by debbugs.gnu.org; 6 Nov 2023 12:00:16 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Nov 06 07:00:16 2023 Received: from localhost ([127.0.0.1]:38820 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1qzyH9-0005om-PE for submit <at> debbugs.gnu.org; Mon, 06 Nov 2023 07:00:16 -0500 Received: from mout-p-102.mailbox.org ([80.241.56.152]:41324) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <arsen@HIDDEN>) id 1qzyH7-0005oZ-HR for 66911 <at> debbugs.gnu.org; Mon, 06 Nov 2023 07:00:14 -0500 Received: from smtp2.mailbox.org (smtp2.mailbox.org [10.196.197.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-102.mailbox.org (Postfix) with ESMTPS id 4SP8z43dbfz9spZ; Mon, 6 Nov 2023 12:59:28 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aarsen.me; s=MBO0001; t=1699271968; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=TqQuN+6uxNs4g4HrvqBOMrjb0xtVI29e9a15pysErwc=; b=bnKFlDFO7cSrCdqXCqJqRP65+iaTjg7+Sajh0J9oLMq0v9vsm/A8iWwJq1FEF227y0+0hD lVDgaXTcGtxg0nslFrdiVlEm73DbhfjJGA+HYakN/9toXICDUscZXPig8oEN6Q2IS/+QCb ravljbGBHLGv7e8L0IILMC8oRAtm/1Dc9r6N2H6VZjRs0e1m1sfHzmL6KKAkwuHjoNjqOB qKYiI7cJ0tW3r//E2vbToJtWjhXUV4TnXUwlaGuq+nEU2uc8GN3O5EPtu6BWUH4YqtJ34q MlnlLTbPGNZDMRJFfEvVyQ+f16GfAMmcN7MecF5G6q7x/c6wu/U0cqmnlOE0gg== References: <87zfzv16io.fsf@HIDDEN> <ZUjEJ-2D0m39qZ7W@ACM> From: Arsen =?utf-8?Q?Arsenovi=C4=87?= <arsen@HIDDEN> To: Alan Mackenzie <acm@HIDDEN> Subject: Re: bug#66911: CC Mode 5.35.2 (C++//l); Noise macro being taken as anchor to class-open Date: Mon, 06 Nov 2023 12:38:36 +0100 In-reply-to: <ZUjEJ-2D0m39qZ7W@ACM> Message-ID: <867cmv2iua.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 66911 Cc: 66911 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.7 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Alan, Alan Mackenzie <acm@HIDDEN> writes: > Hello, Arsen. > > Thanks for taking the trouble to report this bug, and thanks even more > for such a high quality bug report! > > On Fri, Nov 03, 2023 at 10:51:32 +0100, Arsen Arsenovi=C4=87 via CC-Mode-= help wrote: >> Package: cc-mode > >> <#secure method=3Dpgpmime mode=3Dsign> >> Package: cc-mode > >> In the example below: > >> namespace a { >> _BEGIN > >> template<> >> struct foo >> { /* HERE */ >> }; >> } > >> // Local Variables: >> // c-noise-macro-names: ("_BEGIN") >> // End: > >> Pressing C-c C-s on the stat of the line marked HERE shows ((class-open >> 15)), which is the '_' of the '_BEGIN'. This appears to be wrong, as >> the anchor should be the 'class' keyword on the line above, I believe. > >> Anchoring '{' on the class/struct/union that precedes it would also >> enable implementing the GNU libstdc++ code style (as, AFAICT, it is >> currently impossible to indent a class with a basic-offset added to the >> column the 'template' keyword sits on). > > Yes, in function c-looking-at-decl-block, the handling of template > constructs and noise macros was somewhat careless. This should be fixed > by the patch below. > > Even so, it's worth noting that noise macros with parentheses (set with > the buffer local variable c-noise-macro-with-parens-names) are currently > not handled correctly, here. This was a decision taken some years ago, > to avoid slowing down CC Mode for a construct which is rarer than the > noise macros without parens. I'm thinking of taking another look at > this. > > Would you please apply the patch, byte compile cc-engine.el (or all of > CC Mode), load it into your Emacs and try it out on your real C++ code. > The patch should apply cleanly to the Emacs master branch. Then please > confirm that it is actually fixes the bug, or tell me what's still not > working properly. (If you want any help applying the patch or compiling > the file, feel free to send me private email.) That indeed appears to have fixed it. I built emacs 30.0.50 from git (94807b6896191245ff3bef44a0ec21efb918232f) and applied your patch, then compared the analysis and indentation before and after on libstdc++es <bitset>, and it worked as expected (the noise macro stopped confusing it). Though, the anchor still anchors on the template<> line rather than the struct line in: template<size_t _Nw> struct _Base_bitset { ... making it impossible (AFAICT) to create a style that implements: template<size_t _Nw> struct _Base_bitset { }; struct foo { }; instead, the former gets formatted as: template<size_t _Nw> struct _Base_bitset { }; Is this intended? >> Emacs : GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3= .24.38, cairo version 1.17.8) >> of 2023-09-24 >> Package: CC Mode 5.35.2 (C++//l) >> Buffer Style: gnu >> c-emacs-features: (pps-extended-state col-0-paren posix-char-classes >> gen-string-delim gen-comment-delim syntax-properties category-properties >> 1-bit) > > [ .... ] > > diff -r 2760aada61fa cc-engine.el > --- a/cc-engine.el Sun Oct 15 10:44:22 2023 +0000 > +++ b/cc-engine.el Mon Nov 06 10:26:34 2023 +0000 > @@ -12633,31 +12633,27 @@ > (let ((open-brace (point)) kwd-start first-specifier-pos) > (c-syntactic-skip-backward c-block-prefix-charset limit t) >=20=20 > - (when (and c-recognize-<>-arglists > - (eq (char-before) ?>)) > - ;; Could be at the end of a template arglist. > - (let ((c-parse-and-markup-<>-arglists t)) > - (while (and > - (c-backward-<>-arglist nil limit) > - (progn > - (c-syntactic-skip-backward c-block-prefix-charset limit t) > - (eq (char-before) ?>)))))) > - > - ;; Skip back over noise clauses. > - (while (and > - c-opt-cpp-prefix > - (eq (char-before) ?\)) > - (let ((after-paren (point))) > - (if (and (c-go-list-backward) > - (progn (c-backward-syntactic-ws) > - (c-simple-skip-symbol-backward)) > - (or (looking-at c-paren-nontype-key) > - (looking-at c-noise-macro-with-parens-name-re))) > - (progn > - (c-syntactic-skip-backward c-block-prefix-charset limit t) > - t) > - (goto-char after-paren) > - nil)))) > + (while > + (or=20 > + ;; Could be after a template arglist.... > + (and c-recognize-<>-arglists > + (eq (char-before) ?>) > + (let ((c-parse-and-markup-<>-arglists t)) > + (c-backward-<>-arglist nil limit))) > + ;; .... or after a noise clause with parens. > + (and c-opt-cpp-prefix > + (let ((after-paren (point))) > + (if (eq (char-before) ?\)) > + (and > + (c-go-list-backward) > + (eq (char-after) ?\() > + (progn (c-backward-syntactic-ws) > + (c-simple-skip-symbol-backward)) > + (or (looking-at c-paren-nontype-key) ; e.g. __attribute__ > + (looking-at c-noise-macro-with-parens-name-re))) > + (goto-char after-paren) > + nil)))) > + (c-syntactic-skip-backward c-block-prefix-charset limit t)) >=20=20 > ;; Note: Can't get bogus hits inside template arglists below since t= hey > ;; have gotten paren syntax above. > @@ -12667,10 +12663,18 @@ > ;; The `c-decl-block-key' search continues from there since > ;; we know it can't match earlier. > (if goto-start > - (when (c-syntactic-re-search-forward c-symbol-start > - open-brace t t) > - (goto-char (setq first-specifier-pos (match-beginning 0))) > - t) > + (progn > + (while > + (and > + (c-syntactic-re-search-forward c-symbol-start > + open-brace t t) > + (goto-char (match-beginning 0)) > + (if (or (looking-at c-noise-macro-name-re) > + (looking-at c-noise-macro-with-parens-name-re)) > + (c-forward-noise-clause) > + (setq first-specifier-pos (match-beginning 0)) > + nil))) > + first-specifier-pos) > t) >=20=20 > (cond > @@ -12739,34 +12743,39 @@ > (goto-char first-specifier-pos) >=20=20 > (while (< (point) kwd-start) > - (if (looking-at c-symbol-key) > - ;; Accept any plain symbol token on the ground that > - ;; it's a specifier masked through a macro (just > - ;; like `c-forward-decl-or-cast-1' skip forward over > - ;; such tokens). > - ;; > - ;; Could be more restrictive wrt invalid keywords, > - ;; but that'd only occur in invalid code so there's > - ;; no use spending effort on it. > - (let ((end (match-end 0)) > - (kwd-sym (c-keyword-sym (match-string 0)))) > - (unless > - (and kwd-sym > - ;; Moving over a protection kwd and the following > - ;; ":" (in C++ Mode) to the next token could take > - ;; us all the way up to `kwd-start', leaving us > - ;; no chance to update `first-specifier-pos'. > - (not (c-keyword-member kwd-sym 'c-protection-kwds)) > - (c-forward-keyword-clause 0)) > - (goto-char end) > - (c-forward-syntactic-ws))) > - > + (cond > + ((or (looking-at c-noise-macro-name-re) > + (looking-at c-noise-macro-with-parens-name-re)) > + (c-forward-noise-clause)) > + ((looking-at c-symbol-key) > + ;; Accept any plain symbol token on the ground that > + ;; it's a specifier masked through a macro (just > + ;; like `c-forward-decl-or-cast-1' skips forward over > + ;; such tokens). > + ;; > + ;; Could be more restrictive wrt invalid keywords, > + ;; but that'd only occur in invalid code so there's > + ;; no use spending effort on it. > + (let ((end (match-end 0)) > + (kwd-sym (c-keyword-sym (match-string 0)))) > + (unless > + (and kwd-sym > + ;; Moving over a protection kwd and the following > + ;; ":" (in C++ Mode) to the next token could take > + ;; us all the way up to `kwd-start', leaving us > + ;; no chance to update `first-specifier-pos'. > + (not (c-keyword-member kwd-sym 'c-protection-kwds)) > + (c-forward-keyword-clause 0)) > + (goto-char end) > + (c-forward-syntactic-ws)))) > + > + ((c-syntactic-re-search-forward c-symbol-start > + kwd-start 'move t) > ;; Can't parse a declaration preamble and is still > ;; before `kwd-start'. That means `first-specifier-pos' > ;; was in some earlier construct. Search again. > - (if (c-syntactic-re-search-forward c-symbol-start > - kwd-start 'move t) > - (goto-char (setq first-specifier-pos (match-beginning 0))) > + (goto-char (setq first-specifier-pos (match-beginning 0)))) > + (t > ;; Got no preamble before the block declaration keyword. > (setq first-specifier-pos kwd-start)))) >=20=20 > >> --=20 >> Arsen Arsenovi=C4=87 =2D-=20 Arsen Arsenovi=C4=87 --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iOYEARYKAI4WIQT+4rPRE/wAoxYtYGFSwpQwHqLEkwUCZUjVHV8UgAAAAAAuAChp c3N1ZXItZnByQG5vdGF0aW9ucy5vcGVucGdwLmZpZnRoaG9yc2VtYW4ubmV0RkVF MkIzRDExM0ZDMDBBMzE2MkQ2MDYxNTJDMjk0MzAxRUEyQzQ5MxAcYXJzZW5AYWFy c2VuLm1lAAoJEFLClDAeosSTFYIBAPX3dUxuFPSN8dcVgSYn+CR68Fx7utfMjHhP TGH5tqbjAP9ujXKfIIvO0Dls27eWty+lE95iucL67XrlKM61ns4gBA== =oB88 -----END PGP SIGNATURE----- --=-=-=--
bug-cc-mode@HIDDEN
:bug#66911
; Package cc-mode
.
Full text available.Received: (at 66911) by debbugs.gnu.org; 6 Nov 2023 10:47:52 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Nov 06 05:47:52 2023 Received: from localhost ([127.0.0.1]:38679 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1qzx96-0003e0-0n for submit <at> debbugs.gnu.org; Mon, 06 Nov 2023 05:47:52 -0500 Received: from mail.muc.de ([193.149.48.3]:35730) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <acm@HIDDEN>) id 1qzx93-0003dm-8U for 66911 <at> debbugs.gnu.org; Mon, 06 Nov 2023 05:47:50 -0500 Received: (qmail 55815 invoked by uid 3782); 6 Nov 2023 11:47:04 +0100 Received: from acm.muc.de (pd953a5e1.dip0.t-ipconnect.de [217.83.165.225]) (using STARTTLS) by colin.muc.de (tmda-ofmipd) with ESMTP; Mon, 06 Nov 2023 11:47:04 +0100 Received: (qmail 6887 invoked by uid 1000); 6 Nov 2023 10:47:03 -0000 Date: Mon, 6 Nov 2023 10:47:03 +0000 To: Arsen =?utf-8?Q?Arsenovi=C4=87?= <arsen@HIDDEN> Subject: Re: bug#66911: CC Mode 5.35.2 (C++//l); Noise macro being taken as anchor to class-open Message-ID: <ZUjEJ-2D0m39qZ7W@ACM> References: <87zfzv16io.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <87zfzv16io.fsf@HIDDEN> X-Submission-Agent: TMDA/1.3.x (Ph3nix) From: Alan Mackenzie <acm@HIDDEN> X-Primary-Address: acm@HIDDEN X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 66911 Cc: acm@HIDDEN, 66911 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) Hello, Arsen. Thanks for taking the trouble to report this bug, and thanks even more for such a high quality bug report! On Fri, Nov 03, 2023 at 10:51:32 +0100, Arsen Arsenović via CC-Mode-help wrote: > Package: cc-mode > <#secure method=pgpmime mode=sign> > Package: cc-mode > In the example below: > namespace a { > _BEGIN > template<> > struct foo > { /* HERE */ > }; > } > // Local Variables: > // c-noise-macro-names: ("_BEGIN") > // End: > Pressing C-c C-s on the stat of the line marked HERE shows ((class-open > 15)), which is the '_' of the '_BEGIN'. This appears to be wrong, as > the anchor should be the 'class' keyword on the line above, I believe. > Anchoring '{' on the class/struct/union that precedes it would also > enable implementing the GNU libstdc++ code style (as, AFAICT, it is > currently impossible to indent a class with a basic-offset added to the > column the 'template' keyword sits on). Yes, in function c-looking-at-decl-block, the handling of template constructs and noise macros was somewhat careless. This should be fixed by the patch below. Even so, it's worth noting that noise macros with parentheses (set with the buffer local variable c-noise-macro-with-parens-names) are currently not handled correctly, here. This was a decision taken some years ago, to avoid slowing down CC Mode for a construct which is rarer than the noise macros without parens. I'm thinking of taking another look at this. Would you please apply the patch, byte compile cc-engine.el (or all of CC Mode), load it into your Emacs and try it out on your real C++ code. The patch should apply cleanly to the Emacs master branch. Then please confirm that it is actually fixes the bug, or tell me what's still not working properly. (If you want any help applying the patch or compiling the file, feel free to send me private email.) > Emacs : GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.38, cairo version 1.17.8) > of 2023-09-24 > Package: CC Mode 5.35.2 (C++//l) > Buffer Style: gnu > c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-string-delim gen-comment-delim syntax-properties category-properties 1-bit) [ .... ] diff -r 2760aada61fa cc-engine.el --- a/cc-engine.el Sun Oct 15 10:44:22 2023 +0000 +++ b/cc-engine.el Mon Nov 06 10:26:34 2023 +0000 @@ -12633,31 +12633,27 @@ (let ((open-brace (point)) kwd-start first-specifier-pos) (c-syntactic-skip-backward c-block-prefix-charset limit t) - (when (and c-recognize-<>-arglists - (eq (char-before) ?>)) - ;; Could be at the end of a template arglist. - (let ((c-parse-and-markup-<>-arglists t)) - (while (and - (c-backward-<>-arglist nil limit) - (progn - (c-syntactic-skip-backward c-block-prefix-charset limit t) - (eq (char-before) ?>)))))) - - ;; Skip back over noise clauses. - (while (and - c-opt-cpp-prefix - (eq (char-before) ?\)) - (let ((after-paren (point))) - (if (and (c-go-list-backward) - (progn (c-backward-syntactic-ws) - (c-simple-skip-symbol-backward)) - (or (looking-at c-paren-nontype-key) - (looking-at c-noise-macro-with-parens-name-re))) - (progn - (c-syntactic-skip-backward c-block-prefix-charset limit t) - t) - (goto-char after-paren) - nil)))) + (while + (or + ;; Could be after a template arglist.... + (and c-recognize-<>-arglists + (eq (char-before) ?>) + (let ((c-parse-and-markup-<>-arglists t)) + (c-backward-<>-arglist nil limit))) + ;; .... or after a noise clause with parens. + (and c-opt-cpp-prefix + (let ((after-paren (point))) + (if (eq (char-before) ?\)) + (and + (c-go-list-backward) + (eq (char-after) ?\() + (progn (c-backward-syntactic-ws) + (c-simple-skip-symbol-backward)) + (or (looking-at c-paren-nontype-key) ; e.g. __attribute__ + (looking-at c-noise-macro-with-parens-name-re))) + (goto-char after-paren) + nil)))) + (c-syntactic-skip-backward c-block-prefix-charset limit t)) ;; Note: Can't get bogus hits inside template arglists below since they ;; have gotten paren syntax above. @@ -12667,10 +12663,18 @@ ;; The `c-decl-block-key' search continues from there since ;; we know it can't match earlier. (if goto-start - (when (c-syntactic-re-search-forward c-symbol-start - open-brace t t) - (goto-char (setq first-specifier-pos (match-beginning 0))) - t) + (progn + (while + (and + (c-syntactic-re-search-forward c-symbol-start + open-brace t t) + (goto-char (match-beginning 0)) + (if (or (looking-at c-noise-macro-name-re) + (looking-at c-noise-macro-with-parens-name-re)) + (c-forward-noise-clause) + (setq first-specifier-pos (match-beginning 0)) + nil))) + first-specifier-pos) t) (cond @@ -12739,34 +12743,39 @@ (goto-char first-specifier-pos) (while (< (point) kwd-start) - (if (looking-at c-symbol-key) - ;; Accept any plain symbol token on the ground that - ;; it's a specifier masked through a macro (just - ;; like `c-forward-decl-or-cast-1' skip forward over - ;; such tokens). - ;; - ;; Could be more restrictive wrt invalid keywords, - ;; but that'd only occur in invalid code so there's - ;; no use spending effort on it. - (let ((end (match-end 0)) - (kwd-sym (c-keyword-sym (match-string 0)))) - (unless - (and kwd-sym - ;; Moving over a protection kwd and the following - ;; ":" (in C++ Mode) to the next token could take - ;; us all the way up to `kwd-start', leaving us - ;; no chance to update `first-specifier-pos'. - (not (c-keyword-member kwd-sym 'c-protection-kwds)) - (c-forward-keyword-clause 0)) - (goto-char end) - (c-forward-syntactic-ws))) - + (cond + ((or (looking-at c-noise-macro-name-re) + (looking-at c-noise-macro-with-parens-name-re)) + (c-forward-noise-clause)) + ((looking-at c-symbol-key) + ;; Accept any plain symbol token on the ground that + ;; it's a specifier masked through a macro (just + ;; like `c-forward-decl-or-cast-1' skips forward over + ;; such tokens). + ;; + ;; Could be more restrictive wrt invalid keywords, + ;; but that'd only occur in invalid code so there's + ;; no use spending effort on it. + (let ((end (match-end 0)) + (kwd-sym (c-keyword-sym (match-string 0)))) + (unless + (and kwd-sym + ;; Moving over a protection kwd and the following + ;; ":" (in C++ Mode) to the next token could take + ;; us all the way up to `kwd-start', leaving us + ;; no chance to update `first-specifier-pos'. + (not (c-keyword-member kwd-sym 'c-protection-kwds)) + (c-forward-keyword-clause 0)) + (goto-char end) + (c-forward-syntactic-ws)))) + + ((c-syntactic-re-search-forward c-symbol-start + kwd-start 'move t) ;; Can't parse a declaration preamble and is still ;; before `kwd-start'. That means `first-specifier-pos' ;; was in some earlier construct. Search again. - (if (c-syntactic-re-search-forward c-symbol-start - kwd-start 'move t) - (goto-char (setq first-specifier-pos (match-beginning 0))) + (goto-char (setq first-specifier-pos (match-beginning 0)))) + (t ;; Got no preamble before the block declaration keyword. (setq first-specifier-pos kwd-start)))) > -- > Arsen Arsenović -- Alan Mackenzie (Nuremberg, Germany).
bug-cc-mode@HIDDEN
:bug#66911
; Package cc-mode
.
Full text available.Received: (at submit) by debbugs.gnu.org; 3 Nov 2023 10:23:53 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Nov 03 06:23:53 2023 Received: from localhost ([127.0.0.1]:56892 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1qyrLB-0002t0-Mg for submit <at> debbugs.gnu.org; Fri, 03 Nov 2023 06:23:53 -0400 Received: from lists.gnu.org ([2001:470:142::17]:56820) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <arsen@HIDDEN>) id 1qyrL6-0002sa-Lp for submit <at> debbugs.gnu.org; Fri, 03 Nov 2023 06:23:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <arsen@HIDDEN>) id 1qyrKQ-0004lb-Ns for bug-gnu-emacs@HIDDEN; Fri, 03 Nov 2023 06:23:02 -0400 Received: from mout-p-102.mailbox.org ([2001:67c:2050:0:465::102]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_CHACHA20_POLY1305:256) (Exim 4.90_1) (envelope-from <arsen@HIDDEN>) id 1qyrKL-0003fG-UH for bug-gnu-emacs@HIDDEN; Fri, 03 Nov 2023 06:23:02 -0400 Received: from smtp102.mailbox.org (smtp102.mailbox.org [10.196.197.102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-102.mailbox.org (Postfix) with ESMTPS id 4SMGyq6NFHz9sZT for <bug-gnu-emacs@HIDDEN>; Fri, 3 Nov 2023 11:22:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aarsen.me; s=MBO0001; t=1699006963; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=vChdkCGpwq7zhAuKX9UuUPw1szTs6UMioL7L6BpNhEE=; b=iaLCntXFlPMHGUUFpu6dDNS5iveul6w6WCBSizMrWzzupGVgtRDUWTtdVinSYMYeKrSSDy /gUmSk3CJlSz6HQ1y0B6mq3EX3Q4wsdohvxZw+eWHEX64QBnysEUCjjDSshJXGiTMB/9Ut d8L8Fu36Tx51mJ5UYQRUTE6S9WaTUrhrrVG7xu3XdVmTVQLvBzB0AfwQyZC+G2vvsNt4Q+ rrTosD0+oJhL/Y8aOGabLjzvoa8AbJcTB3WU8sNA7BCz66jfJV3sNPmNkcWXVZPVno0S+z nibGmi0XJxTcqx1oB98SCcrToh63ueV5ZnkYyVajQbC+SUQpHaOhHAdS8aSXpg== From: Arsen =?utf-8?Q?Arsenovi=C4=87?= <arsen@HIDDEN> To: bug-gnu-emacs@HIDDEN Subject: CC Mode 5.35.2 (C++//l); Noise macro being taken as anchor to class-open Date: Fri, 03 Nov 2023 10:51:32 +0100 X-Debbugs-Package: cc-mode Message-ID: <87zfzv16io.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Received-SPF: pass client-ip=2001:67c:2050:0:465::102; envelope-from=arsen@HIDDEN; helo=mout-p-102.mailbox.org X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: 0.7 (/) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.3 (/) Package: cc-mode <#secure method=3Dpgpmime mode=3Dsign> Package: cc-mode In the example below: namespace a { _BEGIN template<> struct foo { /* HERE */ }; } // Local Variables: // c-noise-macro-names: ("_BEGIN") // End: Pressing C-c C-s on the stat of the line marked HERE shows ((class-open 15)), which is the '_' of the '_BEGIN'. This appears to be wrong, as the anchor should be the 'class' keyword on the line above, I believe. Anchoring '{' on the class/struct/union that precedes it would also enable implementing the GNU libstdc++ code style (as, AFAICT, it is currently impossible to indent a class with a basic-offset added to the column the 'template' keyword sits on). Emacs : GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24= .38, cairo version 1.17.8) of 2023-09-24 Package: CC Mode 5.35.2 (C++//l) Buffer Style: gnu c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-st= ring-delim gen-comment-delim syntax-properties category-properties 1-bit) current state: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D (setq c-basic-offset 2 c-comment-only-line-offset '(0 . 0) c-indent-comment-alist '((anchored-comment column . 0) (end-block space . = 1) (cpp-end-block space . 2)) c-indent-comments-syntactically-p nil c-block-comment-prefix "" c-comment-prefix-regexp '((pike-mode . "//+!?\\|\\**") (awk-mode . "#+") (other . "//+\\|\\**")) c-doc-comment-style '((java-mode . javadoc) (pike-mode . autodoc) (c-mode . gtkdoc) (c++-mode . gtkdoc)) c-cleanup-list '(scope-operator) c-hanging-braces-alist '((substatement-open before after) (arglist-cont-no= nempty)) c-hanging-colons-alist nil c-hanging-semi&comma-criteria '(c-semi&comma-inside-parenlist) c-backslash-column 48 c-backslash-max-column 72 c-special-indent-hook '(t c-gnu-impose-minimum) c-label-minimum-indentation 1 c-offsets-alist '((inexpr-class . +) (inexpr-statement . +) (lambda-intro-cont . +) (inlambda . 0) (template-args-cont c-lineup-template-args c-lineup-template-args-indented-from-margin ) (incomposition . +) (inmodule . +) (innamespace . +) (inextern-lang . +) (composition-close . 0) (module-close . 0) (namespace-close . 0) (extern-lang-close . 0) (composition-open . 0) (module-open . 0) (namespace-open . 0) (extern-lang-open . 0) (objc-method-call-cont c-lineup-ObjC-method-call-colons c-lineup-ObjC-method-call + ) (objc-method-args-cont . c-lineup-ObjC-method-args) (objc-method-intro . [0]) (friend . 0) (cpp-define-intro c-lineup-cpp-define +) (cpp-macro-cont . +) (cpp-macro . [0]) (inclass . +) (stream-op . c-lineup-streamop) (arglist-cont-nonempty c-lineup-gcc-asm-reg c-lineup-arglist) (arglist-cont c-lineup-gcc-asm-reg 0) (comment-intro c-lineup-knr-region-comment c-lineup-comment) (catch-clause . 0) (else-clause . 0) (do-while-closure . 0) (access-label . -) (case-label . 0) (substatement . +) (statement-case-intro . +) (statement . 0) (brace-entry-open . 0) (brace-list-entry . 0) (brace-list-close . 0) (block-close . 0) (block-open . 0) (inher-cont . c-lineup-multi-inher) (inher-intro . +) (member-init-cont . c-lineup-multi-inher) (member-init-intro . +) (annotation-var-cont . +) (annotation-top-cont . 0) (constraint-cont . +) (topmost-intro . 0) (knr-argdecl . 0) (func-decl-cont . +) (inline-close . 0) (class-close . 0) (class-open . 0) (defun-block-intro . +) (defun-close . 0) (defun-open . 0) (c . c-lineup-C-comments) (string . c-lineup-dont-change) (topmost-intro-cont first c-lineup-topmost-intro-cont c-lineup-gnu-DEFUN-intro-cont ) (brace-list-intro first c-lineup-2nd-brace-entry-in-arglist c-lineup-class-decl-init-+ + ) (brace-list-open . +) (inline-open . 0) (arglist-close . c-lineup-arglist) (arglist-intro . c-lineup-arglist-intro-after-paren) (statement-cont . +) (statement-case-open . +) (label . 0) (substatement-label . 0) (substatement-open . +) (knr-argdecl-intro . 5) (statement-block-intro . +) ) c-buffer-is-cc-mode 'c++-mode c-tab-always-indent t c-syntactic-indentation t c-syntactic-indentation-in-macros t c-ignore-auto-fill '(string cpp code) c-auto-align-backslashes t c-backspace-function 'backward-delete-char-untabify c-delete-function 'delete-char c-electric-pound-behavior nil c-default-style '((java-mode . "java") (awk-mode . "awk") (other . "gnu")) c-enable-xemacs-performance-kludge-p nil c-old-style-variable-behavior nil defun-prompt-regexp nil tab-width 8 comment-column 32 parse-sexp-ignore-comments t parse-sexp-lookup-properties t auto-fill-function 'c-do-auto-fill comment-multi-line t comment-start-skip "\\(?://+\\|/\\*+\\)\\s *" fill-prefix nil fill-column 79 paragraph-start "[ ]*\\(//+\\|\\**\\)[ ]*$\\|^\f" adaptive-fill-mode t adaptive-fill-regexp "[ ]*\\(//+\\|\\**\\)[ ]*\\([ ]*\\([-=E2=80=93!|#%= ;>*=C2=B7=E2=80=A2=E2=80=A3=E2=81=83=E2=97=A6]+[ ]*\\)*\\)" ) --=20 Arsen Arsenovi=C4=87
Arsen Arsenović <arsen@HIDDEN>
:bug-cc-mode@HIDDEN
.
Full text available.bug-cc-mode@HIDDEN
:bug#66911
; Package cc-mode
.
Full text available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.