1 // RUN: %clang_cc1 -std=c++11 %s -verify
7 template<typename X, typename Y> struct T {
8 template<typename A> T(X x, A &&a) {}
10 template<typename A> explicit T(A &&a)
11 noexcept(noexcept(T(X(), static_cast<A &&>(a))))
12 : T(X(), static_cast<A &&>(a)) {}
15 template<typename X, typename Y> struct U : T<X, Y> {
19 U<S, char> foo(char ch) { return U<S, char>(ch); }
28 namespace WrongIdent {
36 namespace DefaultCtorConflict {
37 struct A { A(int = 0); };
40 } b; // ok, not ambiguous, inherited constructor suppresses implicit default constructor
46 namespace InvalidConstruction {
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(...);
58 namespace ExplicitConv {
59 struct B {}; // expected-note 2{{candidate}}
60 struct D : B { // expected-note 3{{candidate}}
61 using B::B; // expected-note 2{{inherited}}
63 struct X { explicit operator B(); } x;
64 struct Y { explicit operator D(); } y;
66 D dx(x); // expected-error {{no matching constructor}}
70 namespace 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}}
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.
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&&).
85 D d4 = {{{{b}}}}; // expected-error {{no match}}