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

From: Arsen Arsenović <[email-masked]>
Date: Fri, 27 Sep 2024 23:54:57 +0200

Hi Alan,

Alan Mackenzie <[email-masked]> writes:

> I've now committed a slightly different patch, after noticing and fixing
> another bug.
>
> The bug was that in code like
>
> 1 template <typename T>
> 2 requires requires (T x)
> 3 { x + x; }
> 4 T add(T a, T b)
> 5 {
> 6    return a + b;
> 7 }
>
> , L4, a topmost-intro-cont used to be anchored on the previous
> topmost-intro-cont line, L2, whereas it should be anchored on the
> topmost-intro, L1.
>
> I've now corrected this.

Ah!  Good catch.

> I didn't send you yet another patch with request for testing, because
> I've done that rather a lot of late, and I'm confident about the patch.
>
> I haven't yet closed the bug, just in case you wanted to do some final,
> final testing on the committed version.  Please let me know what you feel
> about that, so that I can finally close this bug.

I'm not sure this is a bug but it is something I noticed by accident:

      (std::visit
       ([] <typename T>
       	(const T& data)
	{
        }));

... the { is not an inline-open, but an arglist-cont-nonempty (though,
to be clear, the body is indented okay; I've elided it from the example
above for that reason).

Same goes for the (const T& data), which doesn't get indented the same
as a 'standalone' lambda, but it does indent the same as one saved into
a variable:

  []
    ()
  {
  };
  auto x =
    []
    ()
    {
    };
  auto x =
    ([]
     ()
    {
    });

I do not know whether this is correct.

But thank you again for working on this!

Have a lovely day.
-- 
Arsen Arsenović