Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
      2 
      3 // Verify that using an initializer list for a non-aggregate looks for
      4 // constructors..
      5 // Note that due to a (likely) standard bug, this is technically an aggregate,
      6 // but we do not treat it as one.
      7 struct NonAggr1 { // expected-note 2 {{candidate constructor}}
      8   NonAggr1(int, int) { } // expected-note {{candidate constructor}}
      9 
     10   int m;
     11 };
     12 
     13 struct Base { };
     14 struct NonAggr2 : public Base { // expected-note 3 {{candidate constructor}}
     15   int m;
     16 };
     17 
     18 class NonAggr3 { // expected-note 3 {{candidate constructor}}
     19   int m;
     20 };
     21 
     22 struct NonAggr4 { // expected-note 3 {{candidate constructor}}
     23   int m;
     24   virtual void f();
     25 };
     26 
     27 NonAggr1 na1 = { 17 }; // expected-error{{no matching constructor for initialization of 'NonAggr1'}}
     28 NonAggr2 na2 = { 17 }; // expected-error{{no matching constructor for initialization of 'NonAggr2'}}
     29 NonAggr3 na3 = { 17 }; // expected-error{{no matching constructor for initialization of 'NonAggr3'}}
     30 NonAggr4 na4 = { 17 }; // expected-error{{no matching constructor for initialization of 'NonAggr4'}}
     31 
     32 // PR5817
     33 typedef int type[][2];
     34 const type foo = {0};
     35 
     36 // Vector initialization.
     37 typedef short __v4hi __attribute__ ((__vector_size__ (8)));
     38 __v4hi v1 = { (void *)1, 2, 3 }; // expected-error {{cannot initialize a vector element of type 'short' with an rvalue of type 'void *'}}
     39 
     40 // Array initialization.
     41 int a[] = { (void *)1 }; // expected-error {{cannot initialize an array element of type 'int' with an rvalue of type 'void *'}}
     42 
     43 // Struct initialization.
     44 struct S { int a; } s = { (void *)1 }; // expected-error {{cannot initialize a member subobject of type 'int' with an rvalue of type 'void *'}}
     45 
     46 // Check that we're copy-initializing the structs.
     47 struct A {
     48   A();
     49   A(int);
     50   ~A();
     51 
     52   A(const A&) = delete; // expected-note 2 {{'A' has been explicitly marked deleted here}}
     53 };
     54 
     55 struct B {
     56   A a;
     57 };
     58 
     59 struct C {
     60   const A& a;
     61 };
     62 
     63 void f() {
     64   A as1[1] = { };
     65   A as2[1] = { 1 }; // expected-error {{copying array element of type 'A' invokes deleted constructor}}
     66 
     67   B b1 = { };
     68   B b2 = { 1 }; // expected-error {{copying member subobject of type 'A' invokes deleted constructor}}
     69 
     70   C c1 = { 1 };
     71 }
     72 
     73 class Agg {
     74 public:
     75   int i, j;
     76 };
     77 
     78 class AggAgg {
     79 public:
     80   Agg agg1;
     81   Agg agg2;
     82 };
     83 
     84 AggAgg aggagg = { 1, 2, 3, 4 };
     85