Subject: bug#62386: CC Mode 5.35.2 (C++//l); C++ concept indentation

From: Alan Mackenzie <[email-masked]>
Date: Fri, 14 Apr 2023 11:14:39 +0000

Hello, Michael.

Sorry for the delay, it's been a bit of a rough week, here.

On Fri, Apr 07, 2023 at 12:00:13 -0400, Michael Welsh Duggan wrote:
> Alan Mackenzie <[email-masked]> writes:

[ .... ]

> Much, much better!

Thanks for the testing.

> I have only one niggling nit left, and this one doesn't bother me
> nearly as much as the others.  The nit is that opening parentheses
> don't seem to open up a new indention context anymore.  (That's my
> internal mental terminology, not necessary what it used by cc-mode.)

> Before:

>   template <typename T>
>   requires (OctetLike<T>
>             || (std::rank_v<T> == 1 && std::extent_v<T> == 0
>                 && OctetLike<std::remove_extent_t<T>>))
>   Chunk(std::shared_ptr<T> const & p, length_t size)
>   : data_{p, octet_cast(p.get())},
>     size_{size}
>   {}

> After:

>   template <typename T>
>   requires (OctetLike<T>
>     || (std::rank_v<T> == 1 && std::extent_v<T> == 0
>     && OctetLike<std::remove_extent_t<T>>))
>   Chunk(std::shared_ptr<T> const & p, length_t size)
>     : data_{p, octet_cast(p.get())},
>       size_{size}
>   {}

This is a difficult one.  Aligning the || under OctetLike causes problems
when the parenthesis is already far to the right, for example if requires
is on the same line as template.  Then everything will be indented too
far to the right.  This dilemma has come up at least twice before.

I think what's worse is the lack of further indentation of the && line.
I don't know what to do about that, at the moment.

I'm also a little bit worried about the "virtual semicolon" detection on
some more complicated requires constructs.

Anyhow, I think I'll commit what I've got, and leave these doubts to be
cleared up later.

> -- 
> Michael Welsh Duggan
> ([email-masked])

-- 
Alan Mackenzie (Nuremberg, Germany).