Issue 133715
Summary modernize-use-designated-initializers Clang-Tidy check reports std::array when IgnoreSingleElementAggregates is false
Labels clang-tidy
Assignees
Reporter 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
[<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:
```c++
#include <array>

std::array small_primes{.[0] = 2, .[1] = 3, .[2] = 5, .[3] = 7};
```
as the `.` there causes compilation error ([Compiler Explorer](https://godbolt.org/z/xM6T58h1v)):
```none
<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 `.`:
```c++
#include <array>

std::array small_primes{[0] = 2, [1] = 3, [2] = 5, [3] = 7};
```
results in other issues ([Compiler Explorer](https://godbolt.org/z/hdb5ePrb3)):
```none
<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
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to