1 /* PR c++/94510 - nullptr_t implicitly cast to zero twice in std::array
2    { dg-do compile { target c++2a } }
3    { dg-options "-Wall" } */
4 
5 struct A { char a[4]; };
6 template <A> struct B { };
7 
8 constexpr const char c0{ };
9 constexpr const char c1{ 1 };
10 
11 typedef B<A{ }>                     BA;
12 typedef B<A{ { } }>                 BA;
13 typedef B<A{ { 0 } }>               BA;
14 typedef B<A{ { c0 } }>              BA;
15 typedef B<A{ { 0, 0 } }>            BA;
16 typedef B<A{ { 0, 0, 0 } }>         BA;
17 typedef B<A{ { 0, 0, 0, 0 } }>      BA;
18 typedef B<A{ { c0, c0, c0 } }>      BA;
19 typedef B<A{ { c0, c0, c0, c0 } }>  BA;
20 typedef B<A{ "" }>                  BA;
21 typedef B<A{ "\0" }>                BA;
22 typedef B<A{ "\0\0" }>              BA;
23 typedef B<A{ "\0\0\0" }>            BA;
24 
25 typedef B<A{ 1 }>                   BA1;
26 typedef B<A{ { 1 } }>               BA1;
27 typedef B<A{ { 1, 0 } }>            BA1;
28 typedef B<A{ { 1, 0, 0 } }>         BA1;
29 typedef B<A{ { 1, 0, 0, 0 } }>      BA1;
30 typedef B<A{ { c1 } }>              BA1;
31 typedef B<A{ { c1, c0 } }>          BA1;
32 typedef B<A{ { c1, c0, c0 } }>      BA1;
33 typedef B<A{ { c1, c0, c0, c0 } }>  BA1;
34 typedef B<A{ "\1" }>                BA1;
35 typedef B<A{ "\1\0" }>              BA1;
36 typedef B<A{ "\1\0\0" }>            BA1;
37 
38 typedef B<A{ 0, 1 }>                BA01;
39 typedef B<A{ { 0, 1 } }>            BA01;
40 typedef B<A{ { 0, 1, 0 } }>         BA01;
41 typedef B<A{ { 0, 1, 0, 0 } }>      BA01;
42 typedef B<A{ { c0, c1 } }>          BA01;
43 typedef B<A{ { c0, c1, c0 } }>      BA01;
44 typedef B<A{ { c0, c1, c0, c0 } }>  BA01;
45 typedef B<A{ "\0\1" }>              BA01;
46 typedef B<A{ "\0\1\0" }>            BA01;
47 
48 
49 struct C { int a[4]; };
50 template <C> struct D { };
51 
52 constexpr const int i0{ };
53 
54 typedef D<C{ }>                     DC;
55 typedef D<C{ { } }>                 DC;
56 typedef D<C{ { 0 } }>               DC;
57 typedef D<C{ { 0, 0 } }>            DC;
58 typedef D<C{ { 0, 0, 0 } }>         DC;
59 typedef D<C{ { 0, 0, 0, 0 } }>      DC;
60 typedef D<C{ { i0 } }>              DC;
61 typedef D<C{ { i0, i0 } }>          DC;
62 typedef D<C{ { i0, i0, i0 } }>      DC;
63 typedef D<C{ { i0, i0, i0, i0 } }>  DC;
64 
65 
66 constexpr const int i1{ 1 };
67 
68 typedef D<C{ 1 }>                   DC1;
69 typedef D<C{ { 1 } }>               DC1;
70 typedef D<C{ { 1, 0 } }>            DC1;
71 typedef D<C{ { 1, 0, 0 } }>         DC1;
72 typedef D<C{ { 1, 0, 0, 0 } }>      DC1;
73 typedef D<C{ { i1, i0, i0, i0 } }>  DC1;
74 
75 typedef D<C{ 0, 1 }>                DC01;
76 typedef D<C{ { 0, 1 } }>            DC01;
77 typedef D<C{ { 0, 1, 0 } }>         DC01;
78 typedef D<C{ { 0, 1, 0, 0 } }>      DC01;
79 typedef D<C{ { 0, i1, 0, 0 } }>     DC01;
80 typedef D<C{ { i0, i1, i0, i0 } }>  DC01;   // { dg-bogus "conflicting declaration" "pr94567" { xfail *-*-* } }
81