| // RUN: %clang_cc1 -std=c++11 -verify %s |
| // |
| // Note: [class.inhctor] was removed by P0136R1. This tests the new behavior |
| // for the wording that used to be there. |
| |
| struct A { // expected-note 4{{candidate constructor (the implicit}} |
| A(...); // expected-note 4{{candidate constructor}} expected-note 4{{candidate inherited constructor}} |
| A(int = 0, int = 0, int = 0, int = 0, ...); // expected-note 3{{candidate constructor}} expected-note 3{{candidate inherited constructor}} |
| A(int = 0, int = 0, ...); // expected-note 3{{candidate constructor}} expected-note 3{{candidate inherited constructor}} |
| |
| template<typename T> A(T, int = 0, ...); // expected-note 3{{candidate constructor}} expected-note 3{{candidate inherited constructor}} |
| |
| template<typename T, int N> A(const T (&)[N]); // expected-note {{candidate constructor}} expected-note {{candidate inherited constructor}} |
| template<typename T, int N> A(const T (&)[N], int = 0); // expected-note {{candidate constructor}} expected-note {{candidate inherited constructor}} |
| }; |
| |
| struct B : A { // expected-note 4{{candidate constructor (the implicit}} |
| using A::A; // expected-note 15{{inherited here}} |
| B(void*); |
| }; |
| |
| struct C {} c; |
| |
| A a0{}; // expected-error {{ambiguous}} |
| B b0{}; // expected-error {{ambiguous}} |
| |
| A a1{1}; // expected-error {{ambiguous}} |
| B b1{1}; // expected-error {{ambiguous}} |
| |
| A a2{1,2}; // expected-error {{ambiguous}} |
| B b2{1,2}; // expected-error {{ambiguous}} |
| |
| A a3{1,2,3}; // ok |
| B b3{1,2,3}; // ok |
| |
| A a4{1,2,3,4}; // ok |
| B b4{1,2,3,4}; // ok |
| |
| A a5{1,2,3,4,5}; // ok |
| B b5{1,2,3,4,5}; // ok |
| |
| A a6{c}; // ok |
| B b6{c}; // ok |
| |
| A a7{c,0}; // ok |
| B b7{c,0}; // ok |
| |
| A a8{c,0,1}; // ok |
| B b8{c,0,1}; // ok |
| |
| A a9{"foo"}; // expected-error {{ambiguous}} |
| B b9{"foo"}; // expected-error {{ambiguous}} |
| |
| namespace PR15755 { |
| struct X { |
| template<typename...Ts> X(int, Ts...); |
| }; |
| struct Y : X { |
| using X::X; |
| }; |
| struct Z : Y { |
| using Y::Y; |
| }; |
| Z z(0); |
| } |