120599392a99956eaac4cf351a0935574090cb6c3Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 220599392a99956eaac4cf351a0935574090cb6c3Richard Smith 320599392a99956eaac4cf351a0935574090cb6c3Richard Smithnamespace std { 420599392a99956eaac4cf351a0935574090cb6c3Richard Smith typedef decltype(sizeof(int)) size_t; 520599392a99956eaac4cf351a0935574090cb6c3Richard Smith 620599392a99956eaac4cf351a0935574090cb6c3Richard Smith template <typename E> 720599392a99956eaac4cf351a0935574090cb6c3Richard Smith struct initializer_list 820599392a99956eaac4cf351a0935574090cb6c3Richard Smith { 920599392a99956eaac4cf351a0935574090cb6c3Richard Smith const E *p; 1020599392a99956eaac4cf351a0935574090cb6c3Richard Smith size_t n; 1120599392a99956eaac4cf351a0935574090cb6c3Richard Smith initializer_list(const E *p, size_t n) : p(p), n(n) {} 1220599392a99956eaac4cf351a0935574090cb6c3Richard Smith }; 1320599392a99956eaac4cf351a0935574090cb6c3Richard Smith 1420599392a99956eaac4cf351a0935574090cb6c3Richard Smith struct string { 1520599392a99956eaac4cf351a0935574090cb6c3Richard Smith string(const char *); 1620599392a99956eaac4cf351a0935574090cb6c3Richard Smith }; 1720599392a99956eaac4cf351a0935574090cb6c3Richard Smith 1820599392a99956eaac4cf351a0935574090cb6c3Richard Smith template<typename A, typename B> 1920599392a99956eaac4cf351a0935574090cb6c3Richard Smith struct pair { 2020599392a99956eaac4cf351a0935574090cb6c3Richard Smith pair(const A&, const B&); 2120599392a99956eaac4cf351a0935574090cb6c3Richard Smith }; 2220599392a99956eaac4cf351a0935574090cb6c3Richard Smith} 2320599392a99956eaac4cf351a0935574090cb6c3Richard Smith 2420599392a99956eaac4cf351a0935574090cb6c3Richard Smithnamespace bullet2 { 2520599392a99956eaac4cf351a0935574090cb6c3Richard Smith double ad[] = { 1, 2.0 }; 2620599392a99956eaac4cf351a0935574090cb6c3Richard Smith int ai[] = { 1, 2.0 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}} 2720599392a99956eaac4cf351a0935574090cb6c3Richard Smith 2820599392a99956eaac4cf351a0935574090cb6c3Richard Smith struct S2 { 2920599392a99956eaac4cf351a0935574090cb6c3Richard Smith int m1; 3020599392a99956eaac4cf351a0935574090cb6c3Richard Smith double m2, m3; 3120599392a99956eaac4cf351a0935574090cb6c3Richard Smith }; 3220599392a99956eaac4cf351a0935574090cb6c3Richard Smith 3320599392a99956eaac4cf351a0935574090cb6c3Richard Smith S2 s21 = { 1, 2, 3.0 }; 3420599392a99956eaac4cf351a0935574090cb6c3Richard Smith S2 s22 { 1.0, 2, 3 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}} 3520599392a99956eaac4cf351a0935574090cb6c3Richard Smith S2 s23 { }; 3620599392a99956eaac4cf351a0935574090cb6c3Richard Smith} 3720599392a99956eaac4cf351a0935574090cb6c3Richard Smith 3820599392a99956eaac4cf351a0935574090cb6c3Richard Smithnamespace bullet4_example1 { 3920599392a99956eaac4cf351a0935574090cb6c3Richard Smith struct S { 4020599392a99956eaac4cf351a0935574090cb6c3Richard Smith S(std::initializer_list<double> d) {} 4120599392a99956eaac4cf351a0935574090cb6c3Richard Smith S(std::initializer_list<int> i) {} 4220599392a99956eaac4cf351a0935574090cb6c3Richard Smith S() {} 4320599392a99956eaac4cf351a0935574090cb6c3Richard Smith }; 4420599392a99956eaac4cf351a0935574090cb6c3Richard Smith 4520599392a99956eaac4cf351a0935574090cb6c3Richard Smith S s1 = { 1.0, 2.0, 3.0 }; 4620599392a99956eaac4cf351a0935574090cb6c3Richard Smith S s2 = { 1, 2, 3 }; 4720599392a99956eaac4cf351a0935574090cb6c3Richard Smith S s3 = { }; 4820599392a99956eaac4cf351a0935574090cb6c3Richard Smith} 4920599392a99956eaac4cf351a0935574090cb6c3Richard Smith 5020599392a99956eaac4cf351a0935574090cb6c3Richard Smithnamespace bullet4_example2 { 5120599392a99956eaac4cf351a0935574090cb6c3Richard Smith struct Map { 5220599392a99956eaac4cf351a0935574090cb6c3Richard Smith Map(std::initializer_list<std::pair<std::string,int>>) {} 5320599392a99956eaac4cf351a0935574090cb6c3Richard Smith }; 5420599392a99956eaac4cf351a0935574090cb6c3Richard Smith 5520599392a99956eaac4cf351a0935574090cb6c3Richard Smith Map ship = {{"Sophie",14}, {"Surprise",28}}; 5620599392a99956eaac4cf351a0935574090cb6c3Richard Smith} 5720599392a99956eaac4cf351a0935574090cb6c3Richard Smith 5820599392a99956eaac4cf351a0935574090cb6c3Richard Smithnamespace bullet4_example3 { 5920599392a99956eaac4cf351a0935574090cb6c3Richard Smith struct S { 6020599392a99956eaac4cf351a0935574090cb6c3Richard Smith S(int, double, double) {} 6120599392a99956eaac4cf351a0935574090cb6c3Richard Smith S() {} 6220599392a99956eaac4cf351a0935574090cb6c3Richard Smith }; 6320599392a99956eaac4cf351a0935574090cb6c3Richard Smith 6420599392a99956eaac4cf351a0935574090cb6c3Richard Smith S s1 = { 1, 2, 3.0 }; 6520599392a99956eaac4cf351a0935574090cb6c3Richard Smith // FIXME: This is an ill-formed narrowing initialization. 6620599392a99956eaac4cf351a0935574090cb6c3Richard Smith S s2 { 1.0, 2, 3 }; 6720599392a99956eaac4cf351a0935574090cb6c3Richard Smith S s3 {}; 6820599392a99956eaac4cf351a0935574090cb6c3Richard Smith} 6920599392a99956eaac4cf351a0935574090cb6c3Richard Smith 7020599392a99956eaac4cf351a0935574090cb6c3Richard Smithnamespace bullet5 { 7120599392a99956eaac4cf351a0935574090cb6c3Richard Smith struct S { 7220599392a99956eaac4cf351a0935574090cb6c3Richard Smith S(std::initializer_list<double>) {} 7320599392a99956eaac4cf351a0935574090cb6c3Richard Smith S(const std::string &) {} 7420599392a99956eaac4cf351a0935574090cb6c3Richard Smith }; 7520599392a99956eaac4cf351a0935574090cb6c3Richard Smith 7620599392a99956eaac4cf351a0935574090cb6c3Richard Smith const S& r1 = { 1, 2, 3.0 }; 7720599392a99956eaac4cf351a0935574090cb6c3Richard Smith const S& r2 = { "Spinach" }; 7820599392a99956eaac4cf351a0935574090cb6c3Richard Smith S& r3 = { 1, 2, 3 }; // expected-error {{non-const lvalue reference to type 'bullet5::S' cannot bind to an initializer list temporary}} 7920599392a99956eaac4cf351a0935574090cb6c3Richard Smith const int& i1 = { 1 }; 8020599392a99956eaac4cf351a0935574090cb6c3Richard Smith const int& i2 = { 1.1 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}} expected-warning {{implicit conversion}} 8120599392a99956eaac4cf351a0935574090cb6c3Richard Smith const int (&iar)[2] = { 1, 2 }; 8220599392a99956eaac4cf351a0935574090cb6c3Richard Smith} 8320599392a99956eaac4cf351a0935574090cb6c3Richard Smith 8420599392a99956eaac4cf351a0935574090cb6c3Richard Smithnamespace bullet6 { 8520599392a99956eaac4cf351a0935574090cb6c3Richard Smith int x1 {2}; 8620599392a99956eaac4cf351a0935574090cb6c3Richard Smith int x2 {2.0}; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}} 8720599392a99956eaac4cf351a0935574090cb6c3Richard Smith} 8820599392a99956eaac4cf351a0935574090cb6c3Richard Smith 8920599392a99956eaac4cf351a0935574090cb6c3Richard Smithnamespace bullet7 { 9020599392a99956eaac4cf351a0935574090cb6c3Richard Smith int** pp {}; 9120599392a99956eaac4cf351a0935574090cb6c3Richard Smith} 9220599392a99956eaac4cf351a0935574090cb6c3Richard Smith 9320599392a99956eaac4cf351a0935574090cb6c3Richard Smithnamespace bullet8 { 9420599392a99956eaac4cf351a0935574090cb6c3Richard Smith struct A { int i; int j; }; 9520599392a99956eaac4cf351a0935574090cb6c3Richard Smith A a1 { 1, 2 }; 9620599392a99956eaac4cf351a0935574090cb6c3Richard Smith A a2 { 1.2 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}} expected-warning {{implicit conversion}} 9720599392a99956eaac4cf351a0935574090cb6c3Richard Smith 9820599392a99956eaac4cf351a0935574090cb6c3Richard Smith struct B { 9920599392a99956eaac4cf351a0935574090cb6c3Richard Smith B(std::initializer_list<int> i) {} 10020599392a99956eaac4cf351a0935574090cb6c3Richard Smith }; 10120599392a99956eaac4cf351a0935574090cb6c3Richard Smith B b1 { 1, 2 }; 10220599392a99956eaac4cf351a0935574090cb6c3Richard Smith B b2 { 1, 2.0 }; 10320599392a99956eaac4cf351a0935574090cb6c3Richard Smith 10420599392a99956eaac4cf351a0935574090cb6c3Richard Smith struct C { 10520599392a99956eaac4cf351a0935574090cb6c3Richard Smith C(int i, double j) {} 10620599392a99956eaac4cf351a0935574090cb6c3Richard Smith }; 10720599392a99956eaac4cf351a0935574090cb6c3Richard Smith C c1 = { 1, 2.2 }; 10820599392a99956eaac4cf351a0935574090cb6c3Richard Smith // FIXME: This is an ill-formed narrowing initialization. 10920599392a99956eaac4cf351a0935574090cb6c3Richard Smith C c2 = { 1.1, 2 }; // expected-warning {{implicit conversion}} 11020599392a99956eaac4cf351a0935574090cb6c3Richard Smith 11120599392a99956eaac4cf351a0935574090cb6c3Richard Smith int j { 1 }; 11220599392a99956eaac4cf351a0935574090cb6c3Richard Smith int k { }; 11320599392a99956eaac4cf351a0935574090cb6c3Richard Smith} 114