1 | // RUN: %clang_cc1 -std=c++11 -verify %s |
2 | // |
3 | // Note: [class.inhctor] was removed by P0136R1. This tests the new behavior |
4 | // for the wording that used to be there. |
5 | |
6 | struct A { // expected-note 4{{candidate constructor (the implicit}} |
7 | A(...); // expected-note 4{{candidate constructor}} expected-note 4{{candidate inherited constructor}} |
8 | A(int = 0, int = 0, int = 0, int = 0, ...); // expected-note 3{{candidate constructor}} expected-note 3{{candidate inherited constructor}} |
9 | A(int = 0, int = 0, ...); // expected-note 3{{candidate constructor}} expected-note 3{{candidate inherited constructor}} |
10 | |
11 | template<typename T> A(T, int = 0, ...); // expected-note 3{{candidate constructor}} expected-note 3{{candidate inherited constructor}} |
12 | |
13 | template<typename T, int N> A(const T (&)[N]); // expected-note {{candidate constructor}} expected-note {{candidate inherited constructor}} |
14 | template<typename T, int N> A(const T (&)[N], int = 0); // expected-note {{candidate constructor}} expected-note {{candidate inherited constructor}} |
15 | }; |
16 | |
17 | struct B : A { // expected-note 4{{candidate constructor (the implicit}} |
18 | using A::A; // expected-note 15{{inherited here}} |
19 | B(void*); |
20 | }; |
21 | |
22 | struct C {} c; |
23 | |
24 | A a0{}; // expected-error {{ambiguous}} |
25 | B b0{}; // expected-error {{ambiguous}} |
26 | |
27 | A a1{1}; // expected-error {{ambiguous}} |
28 | B b1{1}; // expected-error {{ambiguous}} |
29 | |
30 | A a2{1,2}; // expected-error {{ambiguous}} |
31 | B b2{1,2}; // expected-error {{ambiguous}} |
32 | |
33 | A a3{1,2,3}; // ok |
34 | B b3{1,2,3}; // ok |
35 | |
36 | A a4{1,2,3,4}; // ok |
37 | B b4{1,2,3,4}; // ok |
38 | |
39 | A a5{1,2,3,4,5}; // ok |
40 | B b5{1,2,3,4,5}; // ok |
41 | |
42 | A a6{c}; // ok |
43 | B b6{c}; // ok |
44 | |
45 | A a7{c,0}; // ok |
46 | B b7{c,0}; // ok |
47 | |
48 | A a8{c,0,1}; // ok |
49 | B b8{c,0,1}; // ok |
50 | |
51 | A a9{"foo"}; // expected-error {{ambiguous}} |
52 | B b9{"foo"}; // expected-error {{ambiguous}} |
53 | |
54 | namespace PR15755 { |
55 | struct X { |
56 | template<typename...Ts> X(int, Ts...); |
57 | }; |
58 | struct Y : X { |
59 | using X::X; |
60 | }; |
61 | struct Z : Y { |
62 | using Y::Y; |
63 | }; |
64 | Z z(0); |
65 | } |
66 | |