From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Alan Mackenzie Newsgroups: gmane.emacs.bugs Subject: bug#42270: 28.0.50; cc-mode indentation issue with attributes Date: Sat, 5 Sep 2020 12:13:35 +0000 Message-ID: <20200905121335.GA5479@ACM> References: <20200708170358.sn4omf4vk3jlks4x.ref@ergus> <20200708170358.sn4omf4vk3jlks4x@ergus> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="18547"; mail-complaints-to="usenet@ciao.gmane.io" Cc: acm@muc.de, 42270@debbugs.gnu.org To: Ergus Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Sep 05 14:14:12 2020 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kEX58-0004Zz-7M for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 05 Sep 2020 14:14:10 +0200 Original-Received: from localhost ([::1]:34858 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kEX57-0008Au-94 for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 05 Sep 2020 08:14:09 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:37754) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kEX50-00089f-Mi for bug-gnu-emacs@gnu.org; Sat, 05 Sep 2020 08:14:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:58387) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kEX50-0005q4-Dm for bug-gnu-emacs@gnu.org; Sat, 05 Sep 2020 08:14:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1kEX50-0000mv-9l for bug-gnu-emacs@gnu.org; Sat, 05 Sep 2020 08:14:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Alan Mackenzie Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 05 Sep 2020 12:14:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 42270 X-GNU-PR-Package: emacs Original-Received: via spool by 42270-submit@debbugs.gnu.org id=B42270.15993080252991 (code B ref 42270); Sat, 05 Sep 2020 12:14:02 +0000 Original-Received: (at 42270) by debbugs.gnu.org; 5 Sep 2020 12:13:45 +0000 Original-Received: from localhost ([127.0.0.1]:41699 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kEX4j-0000mB-HV for submit@debbugs.gnu.org; Sat, 05 Sep 2020 08:13:45 -0400 Original-Received: from colin.muc.de ([193.149.48.1]:49767 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1kEX4g-0000lo-Ki for 42270@debbugs.gnu.org; Sat, 05 Sep 2020 08:13:43 -0400 Original-Received: (qmail 73033 invoked by uid 3782); 5 Sep 2020 12:13:35 -0000 Original-Received: from acm.muc.de (p2e5d530f.dip0.t-ipconnect.de [46.93.83.15]) by localhost.muc.de (tmda-ofmipd) with ESMTP; Sat, 05 Sep 2020 14:13:35 +0200 Original-Received: (qmail 6113 invoked by uid 1000); 5 Sep 2020 12:13:35 -0000 Content-Disposition: inline In-Reply-To: <20200708170358.sn4omf4vk3jlks4x@ergus> X-Delivery-Agent: TMDA/1.1.12 (Macallan) X-Primary-Address: acm@muc.de X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:187215 Archived-At: Hello, Ergus. Thanks for the bug report. On Wed, Jul 08, 2020 at 19:03:58 +0200, Ergus wrote: > Hi: > Working in C++ I am getting this indentation difference when arguments > has attributes or not: > TaskDataAccesses(TaskDataAccessesInfo taskAccessInfo) > : _lock(), > _accesses(), > _accessFragments(), _taskwaitFragments() > { > } > TaskDataAccesses(__attribute__((unused)) TaskDataAccessesInfo taskAccessInfo) > : _lock(), > _accesses(), > _accessFragments(), _taskwaitFragments() > { > } > The problem seems to be that in the first case the `:` indentation > symbol (C-c C-o) is recognised as `member-init-intro` (correct) but in > the second one it is detected as a `topmost-intro-cont` which is > actually wrong. Yes, indeed. There were also problems with the fontification in similar fragments, e.g.: TaskDataAccesses(foo((unused)) TaskDataAccessesInfo taskAccessInfo) : _lock(), _accesses(), _accessFragments(), _taskwaitFragments() { } , where typing into "foo" removed the fontification from "Task...unused))", which got replaced on the next redisplay (e.g. after typing M-x). I think the patch below fixes all these problems. Would you please apply it, rebuild CC Mode, load it, and try it out on your real source code. A fairly thorough test would be appreciated, here. Then please let me know if the bug is actually fixed, and whether there are any "strange things" happening. Thanks! > Best, > Ergus > In GNU Emacs 28.0.50 (build 10, x86_64-pc-linux-gnu, X toolkit, cairo version 1.16.0, Xaw scroll bars) > of 2020-07-07 built on ergus > Repository revision: df3ece9d2ed61c9526dbf718e3c96d72bd53dccb > Repository branch: master > System Description: Debian GNU/Linux 10 (buster) diff -r 877c4ad9dae8 cc-engine.el --- a/cc-engine.el Sat Jul 04 16:23:06 2020 +0000 +++ b/cc-engine.el Sat Sep 05 11:53:51 2020 +0000 @@ -2243,7 +2243,7 @@ ((and c-opt-cpp-prefix (looking-at c-noise-macro-name-re)) - ;; Skip over a noise macro. + ;; Skip over a noise macro without parens. (goto-char (match-end 1)) (not (eobp))) @@ -9141,6 +9141,12 @@ (catch 'is-function (while (progn + (while + (cond + ((looking-at c-decl-hangon-key) + (c-forward-keyword-clause 1)) + ((looking-at c-noise-macro-with-parens-name-re) + (c-forward-noise-clause)))) (if (eq (char-after) ?\)) (throw 'is-function t)) (setq cdd-got-type (c-forward-type)) @@ -9789,6 +9795,16 @@ (save-excursion (goto-char after-paren-pos) (c-forward-syntactic-ws) + (progn + (while + (cond + ((and + c-opt-cpp-prefix + (looking-at c-noise-macro-with-parens-name-re)) + (c-forward-noise-clause)) + ((looking-at c-decl-hangon-key) + (c-forward-keyword-clause 1)))) + t) (or (c-forward-type) ;; Recognize a top-level typeless ;; function declaration in C. diff -r 877c4ad9dae8 cc-mode.el --- a/cc-mode.el Sat Jul 04 16:23:06 2020 +0000 +++ b/cc-mode.el Sat Sep 05 11:53:51 2020 +0000 @@ -2236,7 +2236,8 @@ (defun c-fl-decl-end (pos) ;; If POS is inside a declarator, return the end of the token that follows ;; the declarator, otherwise return nil. POS being in a literal does not - ;; count as being in a declarator (on pragmatic grounds). + ;; count as being in a declarator (on pragmatic grounds). POINT is not + ;; preserved. (goto-char pos) (let ((lit-start (c-literal-start)) enclosing-attribute pos1) @@ -2249,12 +2250,31 @@ (let ((lim (save-excursion (and (c-beginning-of-macro) (progn (c-end-of-macro) (point)))))) - (when (and (c-forward-declarator lim) - (or (not (eq (char-after) ?\()) - (c-go-list-forward nil lim)) - (eq (c-forward-token-2 1 nil lim) 0)) - (c-backward-syntactic-ws) - (point))))))) + (and (c-forward-declarator lim) + (if (eq (char-after) ?\() + (and + (c-go-list-forward nil lim) + (progn (c-forward-syntactic-ws lim) + (not (eobp))) + (progn + (if (looking-at c-symbol-char-key) + ;; Deal with baz (foo((bar)) type var), where + ;; foo((bar)) is not semantically valid. The result + ;; must be after var). + (and + (goto-char pos) + (setq pos1 (c-on-identifier)) + (goto-char pos1) + (progn + (c-backward-syntactic-ws) + (eq (char-before) ?\()) + (c-fl-decl-end (1- (point)))) + (c-backward-syntactic-ws) + (point)))) + (and (progn (c-forward-syntactic-ws lim) + (not (eobp))) + (c-backward-syntactic-ws) + (point))))))))) (defun c-change-expand-fl-region (beg end old-len) ;; Expand the region (c-new-BEG c-new-END) to an after-change font-lock diff -r 877c4ad9dae8 cc-vars.el --- a/cc-vars.el Sat Jul 04 16:23:06 2020 +0000 +++ b/cc-vars.el Sat Sep 05 11:53:51 2020 +0000 @@ -1668,7 +1668,8 @@ like \"INLINE\" which are syntactic noise. Such a macro/extension is complete in itself, never having parentheses. All these names must be syntactically valid identifiers. Alternatively, this variable may be a regular expression -which matches the names of such macros. +which matches the names of such macros, in which case it must have a submatch +1 which matches the actual noise macro name. If you change this variable's value, call the function `c-make-noise-macro-regexps' to set the necessary internal variables (or do @@ -1683,7 +1684,8 @@ which optionally have arguments in parentheses, and which expand to nothing. All these names must be syntactically valid identifiers. These are recognized by CC Mode only in declarations. Alternatively, this variable may be a -regular expression which matches the names of such macros. +regular expression which matches the names of such macros, in which case it +must have a submatch 1 which matches the actual noise macro name. If you change this variable's value, call the function `c-make-noise-macro-regexps' to set the necessary internal variables (or do -- Alan Mackenzie (Nuremberg, Germany).