Home | History | Annotate | Download | only in class.inhctor
      1 // RUN: %clang_cc1 -std=c++11 -verify %s
      2 // Per a core issue (no number yet), an ellipsis is always dropped.
      3 struct A {
      4   A(...); // expected-note {{here}}
      5   A(int = 0, int = 0, int = 0, int = 0, ...); // expected-note 9{{here}} expected-note 2{{constructor cannot be inherited}}
      6   A(int = 0, int = 0, ...); // expected-note {{here}}
      7 
      8   template<typename T> A(T, int = 0, ...); // expected-note 5{{here}}
      9 
     10   template<typename T, int N> A(const T (&)[N]); // expected-note 2{{here}} expected-note {{constructor cannot be inherited}}
     11   template<typename T, int N> A(const T (&)[N], int = 0); // expected-note 2{{here}}
     12 };
     13 
     14 struct B : A { // expected-note 6{{candidate}}
     15   using A::A; // expected-warning 4{{inheriting constructor does not inherit ellipsis}} expected-note 16{{candidate}} expected-note 3{{deleted constructor was inherited here}}
     16 };
     17 
     18 struct C {} c;
     19 
     20 B b0{};
     21 // expected-error@-1 {{call to implicitly-deleted default constructor of 'B'}}
     22 // expected-note@-8 {{default constructor of 'B' is implicitly deleted because base class 'A' has multiple default constructors}}
     23 
     24 B b1{1};
     25 // expected-error@-1 {{call to deleted constructor of 'B'}}
     26 
     27 B b2{1,2};
     28 // expected-error@-1 {{call to deleted constructor of 'B'}}
     29 
     30 B b3{1,2,3};
     31 // ok
     32 
     33 B b4{1,2,3,4};
     34 // ok
     35 
     36 B b5{1,2,3,4,5};
     37 // expected-error@-1 {{no matching constructor for initialization of 'B'}}
     38 
     39 B b6{c};
     40 // ok
     41 
     42 B b7{c,0};
     43 // ok
     44 
     45 B b8{c,0,1};
     46 // expected-error@-1 {{no matching constructor}}
     47 
     48 B b9{"foo"};
     49 // FIXME: explain why the inheriting constructor was deleted
     50 // expected-error@-2 {{call to deleted constructor of 'B'}}
     51 
     52 namespace PR15755 {
     53   struct X {
     54     template<typename...Ts> X(int, Ts...);
     55   };
     56   struct Y : X {
     57     using X::X;
     58   };
     59   struct Z : Y {
     60     using Y::Y;
     61   };
     62   Z z(0);
     63 }
     64