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