blob: 5ce8d1aa3e0bb783e29526bacadeac284a8adad8 [file] [log] [blame]
Richard Smith4c163a02013-05-17 02:19:35 +00001// RUN: %clang_cc1 -std=c++11 %s -verify
2
Richard Smith4c163a02013-05-17 02:19:35 +00003namespace PR15757 {
4 struct S {
5 };
6
7 template<typename X, typename Y> struct T {
8 template<typename A> T(X x, A &&a) {}
9
10 template<typename A> explicit T(A &&a)
11 noexcept(noexcept(T(X(), static_cast<A &&>(a))))
12 : T(X(), static_cast<A &&>(a)) {}
13 };
14
15 template<typename X, typename Y> struct U : T<X, Y> {
16 using T<X, Y>::T;
17 };
18
19 U<S, char> foo(char ch) { return U<S, char>(ch); }
20
21 int main() {
22 U<S, int> a(42);
23 U<S, char> b('4');
24 return 0;
25 }
26}
Richard Smith09d5b3a2014-05-01 00:35:04 +000027
28namespace WrongIdent {
29 struct A {};
30 struct B : A {};
31 struct C : B {
32 using B::A;
33 };
34}
Richard Smith5179eb72016-06-28 19:03:57 +000035
36namespace DefaultCtorConflict {
37 struct A { A(int = 0); };
38 struct B : A {
39 using A::A;
40 } b; // ok, not ambiguous, inherited constructor suppresses implicit default constructor
41 struct C {
42 B b;
43 } c;
44}
Richard Smith80a47022016-06-29 01:10:27 +000045
46namespace InvalidConstruction {
47 struct A { A(int); };
48 struct B { B() = delete; };
49 struct C : A, B { using A::A; };
50 // Initialization here is performed as if by a defaulted default constructor,
51 // which would be ill-formed (in the immediate context) in this case because
52 // it would be defined as deleted.
53 template<typename T> void f(decltype(T(0))*);
54 template<typename T> int &f(...);
55 int &r = f<C>(0);
56}
Richard Smith7c2bcc92016-09-07 02:14:33 +000057
58namespace ExplicitConv {
59 struct B {}; // expected-note 2{{candidate}}
60 struct D : B { // expected-note 3{{candidate}}
61 using B::B; // expected-note 2{{inherited}}
62 };
63 struct X { explicit operator B(); } x;
64 struct Y { explicit operator D(); } y;
65
66 D dx(x); // expected-error {{no matching constructor}}
67 D dy(y);
68}
69
70namespace NestedListInit {
71 struct B { B(); } b; // expected-note 5{{candidate}}
72 struct D : B { // expected-note 3{{candidate}}
73 using B::B; // expected-note 2{{inherited}}
74 };
75 // This is a bit weird. We're allowed one pair of braces for overload
76 // resolution, and one more pair of braces due to [over.ics.list]/2.
77 B b1 = {b};
78 B b2 = {{b}};
79 B b3 = {{{b}}}; // expected-error {{no match}}
80 // This is the same, but we get one call to D's version of B::B(const B&)
81 // before the two permitted calls to D::D(D&&).
82 D d1 = {b};
83 D d2 = {{b}};
84 D d3 = {{{b}}};
85 D d4 = {{{{b}}}}; // expected-error {{no match}}
86}