GNU bug report logs - #72695
CC Mode 5.35.2 (C++//l); c++-mode misindents 'if constexpr' inside lambdas

Previous Next

Package: cc-mode;

Reported by: Arsen Arsenović <arsen <at> aarsen.me>

Date: Sun, 18 Aug 2024 09:52:02 UTC

Severity: normal

Done: Alan Mackenzie <acm <at> muc.de>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Alan Mackenzie <acm <at> muc.de>
To: Arsen Arsenović <arsen <at> aarsen.me>
Cc: acm <at> muc.de, 72695 <at> debbugs.gnu.org
Subject: bug#72695: CC Mode 5.35.2 (C++//l); c++-mode misindents 'if constexpr' inside lambdas
Date: Thu, 26 Sep 2024 11:34:24 +0000
Hello, Arsen.

On Sat, Sep 21, 2024 at 21:32:36 +0200, Arsen Arsenović wrote:
> Hi Alan,

> Alan Mackenzie <acm <at> muc.de> writes:
> > On Tue, Sep 10, 2024 at 01:02:50 +0200, Arsen Arsenović wrote:
> >> Alan Mackenzie <acm <at> muc.de> writes:

[ .... ]

> > Thanks, I've now found the place in the C++ syntax where alignas can go
> > in a lambda construct.  It is the only specifier which may go in these
> > places, although any number of attributes are allowed.  (As a matter of
> > interest, attributes in CC Mode are treated as syntactic whitespace.)

> > [ .... ]

> >> >>   void
> >> >>   def ()
> >> >>   {
> >> >>     auto foo = [&,
> >> >>   	      a,
> >> >>   	      b = 123,
> >> >>   	      c,
> >> >>   	      ...d,
> >> >>   	      ...e = 123
> >> >>   	      ]
> >> >>       <typename T,
> >> >>        typename S>
> >> >>       //alignas (128)
> >> >>       [[gnu::noreturn]]
> >> >>       requires some_concept<T>
> >> >>       (int a,
> >> >>        int b,
> >> >>        int c)
> >> >>       consteval
> >> >>       constexpr
> >> >>       mutable
> >> >>       static
> >> >>       //noexcept(true)
> >> >>       [[gnu::packed]]
> >> >>       //alignas (128)
> >> >>       //->
> >> >>       //int
> >> >>       //requires (std::same_as <decltype (a), int>)
> >> >>         {
> >> >>       if constexpr (true)
> >> >>         ;
> >> >>     }
> >> >>   }

> > Question: Is that first (commented out) alignas correct where it is?  My
> > reading of the version of the standard suggests that the alignas (128)
> > should come _after_ the requires some_concept<T>, not before it.

Sorry to keep going on about this, but ....

> I think so, through the 2nd lambda-expression derivation:

I'm interpreting this as being the answer to "Is that first .... alignas
correct?", not a comment on my second sentence "My reading of ...., not
before it.".  If I'm mistaken there, then my next paragraph is without
effect, and I apologise.

>   lambda-introducer < template-parameter-list > requires-clause_opt
>     attribute-specifier-seq_opt lambda-declarator compound-statement

> ... where attribute-specifier-seq is:

>   attribute-specifier-seq_opt attribute-specifier

> ... and attribute-specifier is also possibly alignment-specifier.

> Maybe I am missing something, though?

..... My reading of that lambda-expression derivation is that the "alignas
(128)" is the atribute-specifier-seq_opt, and the "requires
some_concept<T>" is the requires-clause_opt.  Surely the first of these,
the "alignas" needs to come after the second, the "requires"?

Phew!

[ .... ]

> > Even it the patch is good, I'm not quite ready to commit it yet, since I
> > need to amend the test suite somewhat.

> I will test it at a later time tonight or tomorrow.  Sorry for the
> delay.

I got your other post where you reported on that the tests you did were
satisfactory.  Thanks for that!

I'm hoping to get the patch committed before the weekend.

> Thank you once again for your efforts!

> Have a lovely evening!
> -- 
> Arsen Arsenović

-- 
Alan Mackenzie (Nuremberg, Germany).




This bug report was last modified 294 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.