Home | History | Annotate | Download | only in dcl.init.list
      1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
      2 
      3 namespace std {
      4   typedef decltype(sizeof(int)) size_t;
      5 
      6   template <typename E>
      7   struct initializer_list // expected-note 2{{candidate}}
      8   {
      9     const E *p;
     10     size_t n;
     11     initializer_list(const E *p, size_t n) : p(p), n(n) {}
     12   };
     13 
     14   struct string {
     15     string(const char *);
     16   };
     17 
     18   template<typename A, typename B>
     19   struct pair {
     20     pair(const A&, const B&);
     21   };
     22 }
     23 
     24 namespace bullet1 {
     25   double ad[] = { 1, 2.0 };
     26   int ai[] = { 1, 2.0 };  // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}}
     27 
     28   struct S2 {
     29     int m1;
     30     double m2, m3;
     31   };
     32 
     33   S2 s21 = { 1, 2, 3.0 };
     34   S2 s22 { 1.0, 2, 3 };  // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}}
     35   S2 s23 { };
     36 }
     37 
     38 namespace bullet4_example1 {
     39   struct S {
     40     S(std::initializer_list<double> d) {}
     41     S(std::initializer_list<int> i) {}
     42     S() {}
     43   };
     44 
     45   S s1 = { 1.0, 2.0, 3.0 };
     46   S s2 = { 1, 2, 3 };
     47   S s3 = { };
     48 }
     49 
     50 namespace bullet4_example2 {
     51   struct Map {
     52     Map(std::initializer_list<std::pair<std::string,int>>) {}
     53   };
     54 
     55   Map ship = {{"Sophie",14}, {"Surprise",28}};
     56 }
     57 
     58 namespace bullet4_example3 {
     59   struct S {
     60     S(int, double, double) {}
     61     S() {}
     62   };
     63 
     64   S s1 = { 1, 2, 3.0 };
     65   S s2 { 1.0, 2, 3 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}}
     66   S s3 {};
     67 }
     68 
     69 namespace bullet5 {
     70   int x1 {2};
     71   int x2 {2.0};  // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}}
     72 }
     73 
     74 namespace bullet6 {
     75   struct S {
     76     S(std::initializer_list<double>) {}
     77     S(const std::string &) {}
     78   };
     79 
     80   const S& r1 = { 1, 2, 3.0 };
     81   const S& r2 = { "Spinach" };
     82   S& r3 = { 1, 2, 3 };  // expected-error {{non-const lvalue reference to type 'bullet6::S' cannot bind to an initializer list temporary}}
     83   const int& i1 = { 1 };
     84   const int& i2 = { 1.1 };  // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}} expected-warning {{implicit conversion}}
     85   const int (&iar)[2] = { 1, 2 };
     86 }
     87 
     88 namespace bullet7 {
     89   int** pp {};
     90 }
     91 
     92 namespace bullet8 {
     93   struct A { int i; int j; };
     94   A a1 { 1, 2 };
     95   A a2 { 1.2 };  // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}} expected-warning {{implicit conversion}}
     96 
     97   struct B {
     98     B(std::initializer_list<int> i) {}
     99   };
    100   B b1 { 1, 2 };
    101   B b2 { 1, 2.0 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}}
    102 
    103   struct C {
    104     C(int i, double j) {}
    105   };
    106   C c1 = { 1, 2.2 };
    107   // FIXME: Suppress the narrowing warning in the cases where we issue a narrowing error.
    108   C c2 = { 1.1, 2 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{override}} expected-warning {{implicit conversion}}
    109 
    110   int j { 1 };
    111   int k { };
    112 }
    113 
    114 namespace rdar13395022 {
    115   struct MoveOnly {
    116     MoveOnly(MoveOnly&&);
    117   };
    118 
    119   void test(MoveOnly mo) {
    120     // FIXME: These diagnostics are poor.
    121     auto &&list1 = {mo}; // expected-error{{no viable conversion}}
    122     MoveOnly (&&list2)[1] = {mo}; // expected-error{{no viable conversion}}
    123     std::initializer_list<MoveOnly> &&list3 = {};
    124     MoveOnly (&&list4)[1] = {}; // expected-error{{uninitialized}}
    125   }
    126 }
    127