Skip to content

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

@adambadura

Description

@adambadura

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions