1*5030928dSRichard Smith // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Wno-reorder -Wno-c99-designator -Winitializer-overrides %s
2*5030928dSRichard Smith // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Wno-reorder -Wno-c99-designator -Woverride-init %s
3cb642b91SAlex Lorenz 
4cb642b91SAlex Lorenz template <typename T> struct Foo {
5cb642b91SAlex Lorenz   struct SubFoo {
6cb642b91SAlex Lorenz     int bar1;
7cb642b91SAlex Lorenz     int bar2;
8cb642b91SAlex Lorenz   };
9cb642b91SAlex Lorenz 
TestFoo10cb642b91SAlex Lorenz   static void Test() { SubFoo sf = {.bar1 = 10, .bar2 = 20}; } // Expected no warning
11cb642b91SAlex Lorenz };
12cb642b91SAlex Lorenz 
foo()13cb642b91SAlex Lorenz void foo() {
14cb642b91SAlex Lorenz   Foo<int>::Test();
15cb642b91SAlex Lorenz   Foo<bool>::Test();
16cb642b91SAlex Lorenz   Foo<float>::Test();
17cb642b91SAlex Lorenz }
18cb642b91SAlex Lorenz 
19cb642b91SAlex Lorenz template <typename T> struct Bar {
20cb642b91SAlex Lorenz   struct SubFoo {
21cb642b91SAlex Lorenz     int bar1;
22cb642b91SAlex Lorenz     int bar2;
23cb642b91SAlex Lorenz   };
24cb642b91SAlex Lorenz 
TestBar25cb642b91SAlex Lorenz   static void Test() { SubFoo sf = {.bar1 = 10,    // expected-note 2 {{previous initialization is here}}
26cb642b91SAlex Lorenz                                     .bar1 = 20}; } // expected-warning 2 {{initializer overrides prior initialization of this subobject}}
27cb642b91SAlex Lorenz };
28cb642b91SAlex Lorenz 
bar()29cb642b91SAlex Lorenz void bar() {
30cb642b91SAlex Lorenz   Bar<int>::Test();  // expected-note {{in instantiation of member function 'Bar<int>::Test' requested here}}
31cb642b91SAlex Lorenz   Bar<bool>::Test(); // expected-note {{in instantiation of member function 'Bar<bool>::Test' requested here}}
32cb642b91SAlex Lorenz }
33cd839ccfSRichard Smith 
34cd839ccfSRichard Smith namespace Reorder {
35cd839ccfSRichard Smith   struct X {
36cd839ccfSRichard Smith     X(int n);
37cd839ccfSRichard Smith   private:
38cd839ccfSRichard Smith     int i;
39cd839ccfSRichard Smith   };
40cd839ccfSRichard Smith 
41cd839ccfSRichard Smith   struct foo {
42cd839ccfSRichard Smith     X x;
43cd839ccfSRichard Smith     X y;
44cd839ccfSRichard Smith   };
45cd839ccfSRichard Smith 
46cd839ccfSRichard Smith   foo n = {.y = 4, .x = 5};
47cd839ccfSRichard Smith   X arr[2] = {[1] = 1, [0] = 2};
48cd839ccfSRichard Smith }
49cd839ccfSRichard Smith 
50cd839ccfSRichard Smith namespace Reorder2 {
51cd839ccfSRichard Smith   struct S {
52cd839ccfSRichard Smith     S();
53cd839ccfSRichard Smith     S(const S &);
54cd839ccfSRichard Smith     ~S();
55cd839ccfSRichard Smith   };
56cd839ccfSRichard Smith 
57cd839ccfSRichard Smith   struct EF {
58cd839ccfSRichard Smith     S s;
59cd839ccfSRichard Smith   };
60cd839ccfSRichard Smith 
61cd839ccfSRichard Smith   struct PN {
62cd839ccfSRichard Smith     PN(const PN &);
63cd839ccfSRichard Smith   };
64cd839ccfSRichard Smith   extern PN pn;
65cd839ccfSRichard Smith 
66cd839ccfSRichard Smith   struct FLN {
67cd839ccfSRichard Smith     EF ef;
68cd839ccfSRichard Smith     int it;
69cd839ccfSRichard Smith     PN pn;
70cd839ccfSRichard Smith   };
71cd839ccfSRichard Smith 
f()72cd839ccfSRichard Smith   void f() {
73cd839ccfSRichard Smith     FLN new_elem = {
74cd839ccfSRichard Smith         .ef = EF(),
75cd839ccfSRichard Smith         .pn = pn,
76cd839ccfSRichard Smith         .it = 0,
77cd839ccfSRichard Smith     };
78cd839ccfSRichard Smith   }
79cd839ccfSRichard Smith }
80cd839ccfSRichard Smith 
81cd839ccfSRichard Smith namespace Reorder3 {
82cd839ccfSRichard Smith   struct S {
83cd839ccfSRichard Smith     int a, &b, &c; // expected-note 2{{here}}
84cd839ccfSRichard Smith   };
85cd839ccfSRichard Smith   S s1 = {
86cd839ccfSRichard Smith     .a = 1, .c = s1.a, .b = s1.a
87cd839ccfSRichard Smith   };
88cd839ccfSRichard Smith   S s2 = {
89cd839ccfSRichard Smith     .a = 1, .c = s2.a
90cd839ccfSRichard Smith   }; // expected-error {{uninitialized}}
91cd839ccfSRichard Smith   S s3 = {
92cd839ccfSRichard Smith     .b = s3.a, .a = 1,
93cd839ccfSRichard Smith   }; // expected-error {{uninitialized}}
94cd839ccfSRichard Smith }
95cd839ccfSRichard Smith 
96cd839ccfSRichard Smith // Check that we don't even think about whether holes in a designated
97cd839ccfSRichard Smith // initializer are zero-initializable if the holes are filled later.
98cd839ccfSRichard Smith namespace NoCheckingFilledHoles {
99cd839ccfSRichard Smith   template<typename T> struct Error { using type = typename T::type; }; // expected-error 3{{'::'}}
100cd839ccfSRichard Smith 
101cd839ccfSRichard Smith   template<int N>
102cd839ccfSRichard Smith   struct DefaultInitIsError {
103cd839ccfSRichard Smith     DefaultInitIsError(Error<int[N]> = {}); // expected-note 3{{instantiation}} expected-note 3{{passing}}
104cd839ccfSRichard Smith     DefaultInitIsError(int, int);
105cd839ccfSRichard Smith   };
106cd839ccfSRichard Smith 
107cd839ccfSRichard Smith   template<int N>
108cd839ccfSRichard Smith   struct X {
109cd839ccfSRichard Smith     int a;
110cd839ccfSRichard Smith     DefaultInitIsError<N> e;
111cd839ccfSRichard Smith     int b;
112cd839ccfSRichard Smith   };
113cd839ccfSRichard Smith   X<1> x1 = {
114cd839ccfSRichard Smith     .b = 2,
115cd839ccfSRichard Smith     .a = 1,
116cd839ccfSRichard Smith     {4, 4}
117cd839ccfSRichard Smith   };
118cd839ccfSRichard Smith   X<2> x2 = {
119cd839ccfSRichard Smith     .e = {4, 4},
120cd839ccfSRichard Smith     .b = 2,
121cd839ccfSRichard Smith     .a = 1
122cd839ccfSRichard Smith   };
123cd839ccfSRichard Smith   X<3> x3 = {
124cd839ccfSRichard Smith     .b = 2,
125cd839ccfSRichard Smith     .a = 1
126cd839ccfSRichard Smith   }; // expected-note {{default function argument}}
127cd839ccfSRichard Smith   X<4> x4 = {
128cd839ccfSRichard Smith     .a = 1,
129cd839ccfSRichard Smith     .b = 2
130cd839ccfSRichard Smith   }; // expected-note {{default function argument}}
131cd839ccfSRichard Smith   X<5> x5 = {
132cd839ccfSRichard Smith     .e = {4, 4},
133cd839ccfSRichard Smith     .a = 1,
134cd839ccfSRichard Smith     .b = 2
135cd839ccfSRichard Smith   };
136cd839ccfSRichard Smith   X<6> x6 = {
137cd839ccfSRichard Smith     .a = 1,
138cd839ccfSRichard Smith     .b = 2,
139cd839ccfSRichard Smith     .e = {4, 4}
140cd839ccfSRichard Smith   };
141cd839ccfSRichard Smith 
142cd839ccfSRichard Smith   template<int N> struct Y { X<N> x; };
143cd839ccfSRichard Smith   Y<7> y7 = {
144cd839ccfSRichard Smith     .x = {.a = 1, .b = 2}, // expected-note {{default function argument}}
145cd839ccfSRichard Smith     .x.e = {3, 4}
146cd839ccfSRichard Smith   };
147cd839ccfSRichard Smith   Y<8> y8 = {
148cd839ccfSRichard Smith     .x = {.e = {3, 4}},
149cd839ccfSRichard Smith     .x.a = 1,
150cd839ccfSRichard Smith     .x.b = 2
151cd839ccfSRichard Smith   };
152cd839ccfSRichard Smith }
153cd839ccfSRichard Smith 
154cd839ccfSRichard Smith namespace LargeArrayDesignator {
155cd839ccfSRichard Smith   struct X {
156cd839ccfSRichard Smith     int arr[1000000000];
157cd839ccfSRichard Smith   };
158cd839ccfSRichard Smith   struct Y {
159cd839ccfSRichard Smith     int arr[3];
160cd839ccfSRichard Smith   };
161cd839ccfSRichard Smith   void f(X x);
162cd839ccfSRichard Smith   void f(Y y) = delete;
g()163cd839ccfSRichard Smith   void g() {
164cd839ccfSRichard Smith     f({.arr[4] = 1});
165cd839ccfSRichard Smith   }
166cd839ccfSRichard Smith }
167cd839ccfSRichard Smith 
168cd839ccfSRichard Smith namespace ADL {
169cd839ccfSRichard Smith   struct A {};
170cd839ccfSRichard Smith   void f(A, int);
171cd839ccfSRichard Smith 
172cd839ccfSRichard Smith   namespace X {
173cd839ccfSRichard Smith     void f(A, int);
174cd839ccfSRichard Smith     // OK. Would fail if checking {} against type A set the type of the
175cd839ccfSRichard Smith     // initializer list to A, because ADL would find ADL::f, resulting in
176cd839ccfSRichard Smith     // ambiguity.
g()177cd839ccfSRichard Smith     void g() { f({}, {}); }
178cd839ccfSRichard Smith   }
179cd839ccfSRichard Smith }
180