Open
Description
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