Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

modernize-use-designated-initializers Clang-Tidy check reports std::array when IgnoreSingleElementAggregates is false #133715

Open
adambadura opened this issue Mar 31, 2025 · 1 comment

Comments

@adambadura
Copy link

With code like:

#include <array>

std::array small_primes{2, 3, 5, 7};

it issues the following (see Compiler Explorer):

[<source>:3:24: warning: use designated initializer list to initialize 'array<int, 4>' [modernize-use-designated-initializers]](javascript:;)
    3 | std::array small_primes{2, 3, 5, 7};
      |                        ^~~~~~~~~~~~
      |                         .[0]= .[1]= .[2]= .[3]=
/opt/compiler-explorer/gcc-snapshot/lib/gcc/x86_64-linux-gnu/15.0.1/../../../../include/c++/15.0.1/array:102:5: note: aggregate type is defined here
  102 |     struct array
      |     ^
1 warning generated.

Interestingly, the suggestion to use .[i]= is completely wrong:

#include <array>

std::array small_primes{.[0] = 2, .[1] = 3, .[2] = 5, .[3] = 7};

as the . there causes compilation error (Compiler Explorer):

<source>:3:26: error: expected a field designator, such as '.field = 4'
    3 | std::array small_primes{.[0] = 2, .[1] = 3, .[2] = 5, .[3] = 7};
      |                          ^
1 error generated.
Compiler returned: 1

Finally, use of the same without .:

#include <array>

std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};

results in other issues (Compiler Explorer):

<source>:3:25: warning: array designators are a C99 extension [-Wc99-designator]
    3 | std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};
      |                         ^~~
<source>:3:25: error: array designator cannot initialize non-array type 'std::array<enable_if_t<is_same_v<int, int> && is_same_v<int, int> && is_same_v<int, int>, int>, 1 + sizeof...(_Up)>' (aka 'array<int, 1 + sizeof...(_Up)>')
<source>:3:34: error: array designator cannot initialize non-array type 'std::array<enable_if_t<is_same_v<int, int> && is_same_v<int, int> && is_same_v<int, int>, int>, 1 + sizeof...(_Up)>' (aka 'array<int, 1 + sizeof...(_Up)>')
    3 | std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};
      |                                  ^
<source>:3:43: error: array designator cannot initialize non-array type 'std::array<enable_if_t<is_same_v<int, int> && is_same_v<int, int> && is_same_v<int, int>, int>, 1 + sizeof...(_Up)>' (aka 'array<int, 1 + sizeof...(_Up)>')
    3 | std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};
      |                                           ^
<source>:3:52: error: array designator cannot initialize non-array type 'std::array<enable_if_t<is_same_v<int, int> && is_same_v<int, int> && is_same_v<int, int>, int>, 1 + sizeof...(_Up)>' (aka 'array<int, 1 + sizeof...(_Up)>')
    3 | std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};
      |                                                    ^
<source>:3:59: warning: missing field '_M_elems' initializer [-Wmissing-designated-field-initializers]
    3 | std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};
      |                                                           ^
2 warnings and 4 errors generated.
Compiler returned: 1
@llvmbot
Copy link
Member

llvmbot commented Mar 31, 2025

@llvm/issue-subscribers-clang-tidy

Author: Adam Badura (adambadura)

With code like: ```c++ #include <array>

std::array small_primes{2, 3, 5, 7};

it issues the following (see [Compiler Explorer](https://godbolt.org/z/fEoYch83q)):
```none
[&lt;source&gt;:3:24: warning: use designated initializer list to initialize 'array&lt;int, 4&gt;' [modernize-use-designated-initializers]](javascript:;)
    3 | std::array small_primes{2, 3, 5, 7};
      |                        ^~~~~~~~~~~~
      |                         .[0]= .[1]= .[2]= .[3]=
/opt/compiler-explorer/gcc-snapshot/lib/gcc/x86_64-linux-gnu/15.0.1/../../../../include/c++/15.0.1/array:102:5: note: aggregate type is defined here
  102 |     struct array
      |     ^
1 warning generated.

Interestingly, the suggestion to use .[i]= is completely wrong:

#include &lt;array&gt;

std::array small_primes{.[0] = 2, .[1] = 3, .[2] = 5, .[3] = 7};

as the . there causes compilation error (Compiler Explorer):

&lt;source&gt;:3:26: error: expected a field designator, such as '.field = 4'
    3 | std::array small_primes{.[0] = 2, .[1] = 3, .[2] = 5, .[3] = 7};
      |                          ^
1 error generated.
Compiler returned: 1

Finally, use of the same without .:

#include &lt;array&gt;

std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};

results in other issues (Compiler Explorer):

&lt;source&gt;:3:25: warning: array designators are a C99 extension [-Wc99-designator]
    3 | std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};
      |                         ^~~
&lt;source&gt;:3:25: error: array designator cannot initialize non-array type 'std::array&lt;enable_if_t&lt;is_same_v&lt;int, int&gt; &amp;&amp; is_same_v&lt;int, int&gt; &amp;&amp; is_same_v&lt;int, int&gt;, int&gt;, 1 + sizeof...(_Up)&gt;' (aka 'array&lt;int, 1 + sizeof...(_Up)&gt;')
&lt;source&gt;:3:34: error: array designator cannot initialize non-array type 'std::array&lt;enable_if_t&lt;is_same_v&lt;int, int&gt; &amp;&amp; is_same_v&lt;int, int&gt; &amp;&amp; is_same_v&lt;int, int&gt;, int&gt;, 1 + sizeof...(_Up)&gt;' (aka 'array&lt;int, 1 + sizeof...(_Up)&gt;')
    3 | std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};
      |                                  ^
&lt;source&gt;:3:43: error: array designator cannot initialize non-array type 'std::array&lt;enable_if_t&lt;is_same_v&lt;int, int&gt; &amp;&amp; is_same_v&lt;int, int&gt; &amp;&amp; is_same_v&lt;int, int&gt;, int&gt;, 1 + sizeof...(_Up)&gt;' (aka 'array&lt;int, 1 + sizeof...(_Up)&gt;')
    3 | std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};
      |                                           ^
&lt;source&gt;:3:52: error: array designator cannot initialize non-array type 'std::array&lt;enable_if_t&lt;is_same_v&lt;int, int&gt; &amp;&amp; is_same_v&lt;int, int&gt; &amp;&amp; is_same_v&lt;int, int&gt;, int&gt;, 1 + sizeof...(_Up)&gt;' (aka 'array&lt;int, 1 + sizeof...(_Up)&gt;')
    3 | std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};
      |                                                    ^
&lt;source&gt;:3:59: warning: missing field '_M_elems' initializer [-Wmissing-designated-field-initializers]
    3 | std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};
      |                                                           ^
2 warnings and 4 errors generated.
Compiler returned: 1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants