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