Subject: Re: bug#19867: c++-mode indentation issues with C++1x initializer lists

From: Stefan Kangas <[email-masked]>
Date: Tue, 11 Mar 2025 09:54:20 -0700

Stefan Kangas <[email-masked]> writes:

> Simon <[email-masked]> writes:
>
>> Initializer lists use curly braces, but their contents do not indent properly with emacs' c++-mode.
>> In short, one may use an initializer list to declare and initialize a vector of integers as such:
>>   std::vector<int> Foo( { 1, 2, 3, 4, 5 } );
>>
>> Problems arise when the elements of the list span on multiple line and it gets even worse when the elements are lambda-expressions
>> and nested initializer lists.
>> The following code illustrate most cases and related situations.  The code below compiles without error or warning with gcc 4.8.3.
>
> I had a look at the fairly long example provided here, and AFAICT, the
> indentation is incorrect in the below cases (trimmed down from the
> original).  Some of the examples of incorrect indentation were already
> fixed.
>
> Alan, could you perhaps take a look at this and see if this is something
> that is fixable?  Thanks in advance.

Alan, any chance you could look into the below cases?  Thanks in advance.

> #include <vector>
> #include <functional>
>
> namespace emacs_initlist_indentation_bug {
>   struct DEF {
>     int d, //
>       e,   // indented from "int" + 2
>       f;   //
>   };
>   struct GHI {
>     int   //
>     g,    // indented from "int" +0
>       h,  // indented from "int" + 2
>       i;  //
>   };
>
>   void f4 (int a, int b, int c)
>   {
>     std::vector<ABC> abcList2(                     // Source of
> alignment for closing ")" below
>       {{a+6,
>         b+6,
>         c+6}
>       }                    //
>                                                    ); /* Somehow, this
> one aligns with first line's comment position!! */
>   }
>
>   lambda_initlist_bug.push_back(              //
>     [](int p)     // OK, text-book indentation
>     {             //
>       return p+p; //
>     }             //
>                                               );  /* Aligned with
> first comment! */
>   }
> }