blob: 3ea53095d4ea6c5fd9d277d5d0a56e3b14e8abc4 [file] [log] [blame]
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001// RUN: %clang_cc1 -std=c++0x -fsyntax-only -fexceptions -verify %s
Sebastian Redl10f04a62011-12-22 14:44:04 +00002
Sebastian Redlcf15cef2011-12-22 18:58:38 +00003struct one { char c[1]; };
4struct two { char c[2]; };
5
Sebastian Redl56a04282012-02-11 23:51:08 +00006namespace std {
7 typedef decltype(sizeof(int)) size_t;
8
9 // libc++'s implementation
10 template <class _E>
11 class initializer_list
12 {
13 const _E* __begin_;
14 size_t __size_;
15
16 initializer_list(const _E* __b, size_t __s)
17 : __begin_(__b),
18 __size_(__s)
19 {}
20
21 public:
22 typedef _E value_type;
23 typedef const _E& reference;
24 typedef const _E& const_reference;
25 typedef size_t size_type;
26
27 typedef const _E* iterator;
28 typedef const _E* const_iterator;
29
30 initializer_list() : __begin_(nullptr), __size_(0) {}
31
32 size_t size() const {return __size_;}
33 const _E* begin() const {return __begin_;}
34 const _E* end() const {return __begin_ + __size_;}
35 };
36}
37
Sebastian Redl10f04a62011-12-22 14:44:04 +000038namespace objects {
39
40 struct X1 { X1(int); };
Sebastian Redl70e24fc2012-04-01 19:54:59 +000041 struct X2 { explicit X2(int); }; // expected-note {{constructor declared here}}
Sebastian Redl10f04a62011-12-22 14:44:04 +000042
43 template <int N>
44 struct A {
45 A() { static_assert(N == 0, ""); }
46 A(int, double) { static_assert(N == 1, ""); }
47 };
48
49 template <int N>
Sebastian Redl56a04282012-02-11 23:51:08 +000050 struct F {
51 F() { static_assert(N == 0, ""); }
52 F(int, double) { static_assert(N == 1, ""); }
53 F(std::initializer_list<int>) { static_assert(N == 3, ""); }
54 };
55
56 template <int N>
57 struct D {
58 D(std::initializer_list<int>) { static_assert(N == 0, ""); } // expected-note 1 {{candidate}}
59 D(std::initializer_list<double>) { static_assert(N == 1, ""); } // expected-note 1 {{candidate}}
60 };
61
62 template <int N>
Sebastian Redl10f04a62011-12-22 14:44:04 +000063 struct E {
64 E(int, int) { static_assert(N == 0, ""); }
65 E(X1, int) { static_assert(N == 1, ""); }
66 };
67
68 void overload_resolution() {
69 { A<0> a{}; }
70 { A<0> a = {}; }
71 { A<1> a{1, 1.0}; }
72 { A<1> a = {1, 1.0}; }
73
Sebastian Redl56a04282012-02-11 23:51:08 +000074 { F<0> f{}; }
75 { F<0> f = {}; }
76 // Narrowing conversions don't affect viability. The next two choose
77 // the initializer_list constructor.
Stephen Hines6bcf27b2014-05-29 04:14:42 -070078 { F<3> f{1, 1.0}; } // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{silence}}
79 { F<3> f = {1, 1.0}; } // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{silence}}
Sebastian Redl56a04282012-02-11 23:51:08 +000080 { F<3> f{1, 2, 3, 4, 5, 6, 7, 8}; }
81 { F<3> f = {1, 2, 3, 4, 5, 6, 7, 8}; }
82 { F<3> f{1, 2, 3, 4, 5, 6, 7, 8}; }
83 { F<3> f{1, 2}; }
84
85 { D<0> d{1, 2, 3}; }
86 { D<1> d{1.0, 2.0, 3.0}; }
87 { D<-1> d{1, 2.0}; } // expected-error {{ambiguous}}
88
Sebastian Redl10f04a62011-12-22 14:44:04 +000089 { E<0> e{1, 2}; }
90 }
91
92 void explicit_implicit() {
93 { X1 x{0}; }
94 { X1 x = {0}; }
95 { X2 x{0}; }
Sebastian Redl70e24fc2012-04-01 19:54:59 +000096 { X2 x = {0}; } // expected-error {{constructor is explicit}}
Sebastian Redl10f04a62011-12-22 14:44:04 +000097 }
98
99 struct C {
100 C();
101 C(int, double);
102 C(int, int);
103
104 int operator[](C);
105 };
106
107 C function_call() {
108 void takes_C(C);
109 takes_C({1, 1.0});
110
Sebastian Redlcf15cef2011-12-22 18:58:38 +0000111 C c;
112 c[{1, 1.0}];
Sebastian Redl10f04a62011-12-22 14:44:04 +0000113
114 return {1, 1.0};
115 }
116
117 void inline_init() {
Sebastian Redl62f13c92011-12-22 18:58:29 +0000118 (void) C{1, 1.0};
Sebastian Redl10f04a62011-12-22 14:44:04 +0000119 (void) new C{1, 1.0};
Sebastian Redl56a04282012-02-11 23:51:08 +0000120 (void) A<1>{1, 1.0};
121 (void) new A<1>{1, 1.0};
Sebastian Redl10f04a62011-12-22 14:44:04 +0000122 }
123
Sebastian Redlcf15cef2011-12-22 18:58:38 +0000124 struct B { // expected-note 2 {{candidate constructor}}
125 B(C, int, C); // expected-note {{candidate constructor not viable: cannot convert initializer list argument to 'objects::C'}}
Sebastian Redl10f04a62011-12-22 14:44:04 +0000126 };
127
128 void nested_init() {
Sebastian Redlcf15cef2011-12-22 18:58:38 +0000129 B b1{{1, 1.0}, 2, {3, 4}};
130 B b2{{1, 1.0, 4}, 2, {3, 4}}; // expected-error {{no matching constructor for initialization of 'objects::B'}}
131 }
132
133 void overloaded_call() {
134 one ov1(B); // expected-note {{not viable: cannot convert initializer list}}
135 two ov1(C); // expected-note {{not viable: cannot convert initializer list}}
136
137 static_assert(sizeof(ov1({})) == sizeof(two), "bad overload");
138 static_assert(sizeof(ov1({1, 2})) == sizeof(two), "bad overload");
139 static_assert(sizeof(ov1({{1, 1.0}, 2, {3, 4}})) == sizeof(one), "bad overload");
140
141 ov1({1}); // expected-error {{no matching function}}
Sebastian Redl56a04282012-02-11 23:51:08 +0000142
143 one ov2(int);
144 two ov2(F<3>);
145 static_assert(sizeof(ov2({1})) == sizeof(one), "bad overload"); // list -> int ranks as identity
146 static_assert(sizeof(ov2({1, 2, 3})) == sizeof(two), "bad overload"); // list -> F only viable
Sebastian Redl10f04a62011-12-22 14:44:04 +0000147 }
Sebastian Redl168319c2012-02-12 16:37:24 +0000148
Sebastian Redl20ff0e22012-02-13 19:55:43 +0000149 struct G { // expected-note 6 {{not viable}}
Sebastian Redl168319c2012-02-12 16:37:24 +0000150 // This is not an initializer-list constructor.
151 template<typename ...T>
Sebastian Redl20ff0e22012-02-13 19:55:43 +0000152 G(std::initializer_list<int>, T ...); // expected-note 3 {{not viable}}
Sebastian Redl168319c2012-02-12 16:37:24 +0000153 };
154
Sebastian Redl70e24fc2012-04-01 19:54:59 +0000155 struct H { // expected-note 6 {{not viable}}
156 explicit H(int, int); // expected-note 3 {{not viable}} expected-note {{declared here}}
157 H(int, void*); // expected-note 3 {{not viable}}
Sebastian Redl168319c2012-02-12 16:37:24 +0000158 };
159
160 void edge_cases() {
161 // invalid (the first phase only considers init-list ctors)
162 // (for the second phase, no constructor is viable)
163 G g1{1, 2, 3}; // expected-error {{no matching constructor}}
Sebastian Redl20ff0e22012-02-13 19:55:43 +0000164 (void) new G{1, 2, 3}; // expected-error {{no matching constructor}}
165 (void) G{1, 2, 3} // expected-error {{no matching constructor}}
Sebastian Redl168319c2012-02-12 16:37:24 +0000166
167 // valid (T deduced to <>).
168 G g2({1, 2, 3});
Sebastian Redl20ff0e22012-02-13 19:55:43 +0000169 (void) new G({1, 2, 3});
170 (void) G({1, 2, 3});
Sebastian Redl168319c2012-02-12 16:37:24 +0000171
172 // invalid
173 H h1({1, 2}); // expected-error {{no matching constructor}}
Sebastian Redl20ff0e22012-02-13 19:55:43 +0000174 (void) new H({1, 2}); // expected-error {{no matching constructor}}
175 // FIXME: Bad diagnostic, mentions void type instead of init list.
176 (void) H({1, 2}); // expected-error {{no matching conversion}}
Sebastian Redl168319c2012-02-12 16:37:24 +0000177
178 // valid (by copy constructor).
179 H h2({1, nullptr});
Sebastian Redl20ff0e22012-02-13 19:55:43 +0000180 (void) new H({1, nullptr});
181 (void) H({1, nullptr});
Sebastian Redl168319c2012-02-12 16:37:24 +0000182
183 // valid
184 H h3{1, 2};
Sebastian Redl20ff0e22012-02-13 19:55:43 +0000185 (void) new H{1, 2};
186 (void) H{1, 2};
Sebastian Redl168319c2012-02-12 16:37:24 +0000187 }
Sebastian Redl33deb352012-02-22 10:50:08 +0000188
189 struct memberinit {
190 H h1{1, nullptr};
191 H h2 = {1, nullptr};
192 H h3{1, 1};
Sebastian Redl70e24fc2012-04-01 19:54:59 +0000193 H h4 = {1, 1}; // expected-error {{constructor is explicit}}
Sebastian Redl33deb352012-02-22 10:50:08 +0000194 };
Sebastian Redl10f04a62011-12-22 14:44:04 +0000195}
Sebastian Redladfb5352012-02-27 22:38:26 +0000196
197namespace PR12092 {
198
199 struct S {
200 S(const char*);
201 };
202 struct V {
203 template<typename T> V(T, T);
204 void f(std::initializer_list<S>);
205 void f(const V &);
206 };
207
208 void g() {
209 extern V s;
210 s.f({"foo", "bar"});
211 }
212
213}
Sebastian Redl51ad9cd2012-02-29 12:47:43 +0000214
215namespace PR12117 {
216 struct A { A(int); };
217 struct B { B(A); } b{{0}};
218 struct C { C(int); } c{0};
219}
Sebastian Redl188158d2012-03-08 21:05:45 +0000220
221namespace PR12167 {
222 template<int N> struct string {};
223
224 struct X {
225 X(const char v);
226 template<typename T> bool operator()(T) const;
227 };
228
229 template<int N, class Comparator> bool g(const string<N>& s, Comparator cmp) {
230 return cmp(s);
231 }
232 template<int N> bool f(const string<N> &s) {
233 return g(s, X{'x'});
234 }
235
236 bool s = f(string<1>());
237}
Sebastian Redl1cd89c42012-03-20 21:24:14 +0000238
Sebastian Redlf78c0f92012-03-27 18:33:03 +0000239namespace PR12257_PR12241 {
Sebastian Redl1cd89c42012-03-20 21:24:14 +0000240 struct command_pair
241 {
242 command_pair(int, int);
243 };
244
245 struct command_map
246 {
247 command_map(std::initializer_list<command_pair>);
248 };
249
250 struct generator_pair
251 {
252 generator_pair(const command_map);
253 };
254
Sebastian Redlf78c0f92012-03-27 18:33:03 +0000255 // 5 levels: init list, gen_pair, command_map, init list, command_pair
256 const std::initializer_list<generator_pair> x = {{{{{3, 4}}}}};
257
258 // 4 levels: init list, gen_pair, command_map via init list, command_pair
259 const std::initializer_list<generator_pair> y = {{{{1, 2}}}};
Sebastian Redl1cd89c42012-03-20 21:24:14 +0000260}
Sebastian Redl70e24fc2012-04-01 19:54:59 +0000261
262namespace PR12120 {
263 struct A { explicit A(int); A(float); }; // expected-note {{declared here}}
264 A a = { 0 }; // expected-error {{constructor is explicit}}
265
266 struct B { explicit B(short); B(long); }; // expected-note 2 {{candidate}}
267 B b = { 0 }; // expected-error {{ambiguous}}
268}
Douglas Gregor69a30b82012-04-10 20:43:46 +0000269
270namespace PR12498 {
271 class ArrayRef; // expected-note{{forward declaration}}
272
273 struct C {
274 void foo(const ArrayRef&); // expected-note{{passing argument to parameter here}}
275 };
276
277 static void bar(C* c)
278 {
279 c->foo({ nullptr, 1 }); // expected-error{{initialization of incomplete type 'const PR12498::ArrayRef'}}
280 }
Richard Smithf4bb8d02012-07-05 08:39:21 +0000281}
Douglas Gregor69a30b82012-04-10 20:43:46 +0000282
Richard Smithf4bb8d02012-07-05 08:39:21 +0000283namespace explicit_default {
284 struct A {
285 explicit A(); // expected-note{{here}}
286 };
287 A a {}; // ok
288 // This is copy-list-initialization, and we choose an explicit constructor
289 // (even though we do so via value-initialization), so the initialization is
290 // ill-formed.
291 A b = {}; // expected-error{{chosen constructor is explicit}}
292}
293
294namespace init_list_default {
295 struct A {
296 A(std::initializer_list<int>);
297 };
298 A a {}; // calls initializer list constructor
299
300 struct B {
301 B();
302 B(std::initializer_list<int>) = delete;
303 };
304 B b {}; // calls default constructor
Douglas Gregor69a30b82012-04-10 20:43:46 +0000305}
Douglas Gregordd084272012-09-14 04:20:37 +0000306
Richard Smithc83c2302012-12-19 01:39:02 +0000307// PR13470, <rdar://problem/11974632>
308namespace PR13470 {
309 struct W {
310 explicit W(int); // expected-note {{here}}
311 };
312
Douglas Gregordd084272012-09-14 04:20:37 +0000313 struct X {
Richard Smithc83c2302012-12-19 01:39:02 +0000314 X(const X&) = delete; // expected-note 3 {{here}}
Douglas Gregordd084272012-09-14 04:20:37 +0000315 X(int);
316 };
317
Richard Smithc83c2302012-12-19 01:39:02 +0000318 template<typename T, typename Fn> void call(Fn f) {
319 f({1}); // expected-error {{constructor is explicit}}
320 f(T{1}); // expected-error {{call to deleted constructor}}
321 }
322
323 void ref_w(const W &); // expected-note 2 {{not viable}}
324 void call_ref_w() {
325 ref_w({1}); // expected-error {{no matching function}}
326 ref_w(W{1});
327 call<W>(ref_w); // expected-note {{instantiation of}}
328 }
329
330 void ref_x(const X &);
331 void call_ref_x() {
332 ref_x({1});
333 ref_x(X{1});
334 call<X>(ref_x); // ok
335 }
336
337 void val_x(X); // expected-note 2 {{parameter}}
338 void call_val_x() {
339 val_x({1});
340 val_x(X{1}); // expected-error {{call to deleted constructor}}
341 call<X>(val_x); // expected-note {{instantiation of}}
342 }
343
Douglas Gregordd084272012-09-14 04:20:37 +0000344 template<typename T>
Richard Smithc83c2302012-12-19 01:39:02 +0000345 struct Y {
Douglas Gregordd084272012-09-14 04:20:37 +0000346 X x{1};
Richard Smithc83c2302012-12-19 01:39:02 +0000347 void f() { X x{1}; }
348 void h() {
349 ref_w({1}); // expected-error {{no matching function}}
350 ref_w(W{1});
351 ref_x({1});
352 ref_x(X{1});
353 val_x({1});
354 val_x(X{1}); // expected-error {{call to deleted constructor}}
355 }
356 Y() {}
357 Y(int) : x{1} {}
Douglas Gregordd084272012-09-14 04:20:37 +0000358 };
359
360 Y<int> yi;
Richard Smithc83c2302012-12-19 01:39:02 +0000361 Y<int> yi2(0);
362 void g() {
363 yi.f();
364 yi.h(); // ok, all diagnostics produced in template definition
365 }
Douglas Gregordd084272012-09-14 04:20:37 +0000366}
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700367
368namespace PR19729 {
369 struct A {
370 A(int);
371 A(const A&) = delete;
372 };
373 struct B {
374 void *operator new(std::size_t, A);
375 };
376 B *p = new ({123}) B;
377}
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700378
379namespace PR11410 {
380 struct A {
381 A() = delete; // expected-note 2{{deleted here}}
382 A(int);
383 };
384
385 A a[3] = {
386 {1}, {2}
387 }; // expected-error {{call to deleted constructor}} \
388 expected-note {{in implicit initialization of array element 2 with omitted initializer}}
389
390 struct B {
391 A a; // expected-note {{in implicit initialization of field 'a'}}
392 } b = {
393 }; // expected-error {{call to deleted constructor}}
394
395 struct C {
396 C(int = 0); // expected-note 2{{candidate}}
397 C(float = 0); // expected-note 2{{candidate}}
398 };
399 C c[3] = {
400 0, 1
401 }; // expected-error {{ambiguous}} expected-note {{in implicit initialization of array element 2}}
402 C c2[3] = {
403 [0] = 1, [2] = 3
404 }; // expected-error {{ambiguous}} expected-note {{in implicit initialization of array element 1}}
405}