1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 %s -verify 2*67e74705SXin Li 3*67e74705SXin Li // expected-no-diagnostics 4*67e74705SXin Li 5*67e74705SXin Li namespace PR15757 { 6*67e74705SXin Li struct S { 7*67e74705SXin Li }; 8*67e74705SXin Li 9*67e74705SXin Li template<typename X, typename Y> struct T { TPR15757::T10*67e74705SXin Li template<typename A> T(X x, A &&a) {} 11*67e74705SXin Li TPR15757::T12*67e74705SXin Li template<typename A> explicit T(A &&a) 13*67e74705SXin Li noexcept(noexcept(T(X(), static_cast<A &&>(a)))) 14*67e74705SXin Li : T(X(), static_cast<A &&>(a)) {} 15*67e74705SXin Li }; 16*67e74705SXin Li 17*67e74705SXin Li template<typename X, typename Y> struct U : T<X, Y> { 18*67e74705SXin Li using T<X, Y>::T; 19*67e74705SXin Li }; 20*67e74705SXin Li foo(char ch)21*67e74705SXin Li U<S, char> foo(char ch) { return U<S, char>(ch); } 22*67e74705SXin Li main()23*67e74705SXin Li int main() { 24*67e74705SXin Li U<S, int> a(42); 25*67e74705SXin Li U<S, char> b('4'); 26*67e74705SXin Li return 0; 27*67e74705SXin Li } 28*67e74705SXin Li } 29*67e74705SXin Li 30*67e74705SXin Li namespace WrongIdent { 31*67e74705SXin Li struct A {}; 32*67e74705SXin Li struct B : A {}; 33*67e74705SXin Li struct C : B { 34*67e74705SXin Li using B::A; 35*67e74705SXin Li }; 36*67e74705SXin Li } 37*67e74705SXin Li 38*67e74705SXin Li namespace DefaultCtorConflict { 39*67e74705SXin Li struct A { A(int = 0); }; 40*67e74705SXin Li struct B : A { 41*67e74705SXin Li using A::A; 42*67e74705SXin Li } b; // ok, not ambiguous, inherited constructor suppresses implicit default constructor 43*67e74705SXin Li struct C { 44*67e74705SXin Li B b; 45*67e74705SXin Li } c; 46*67e74705SXin Li } 47*67e74705SXin Li 48*67e74705SXin Li namespace InvalidConstruction { 49*67e74705SXin Li struct A { A(int); }; 50*67e74705SXin Li struct B { B() = delete; }; 51*67e74705SXin Li struct C : A, B { using A::A; }; 52*67e74705SXin Li // Initialization here is performed as if by a defaulted default constructor, 53*67e74705SXin Li // which would be ill-formed (in the immediate context) in this case because 54*67e74705SXin Li // it would be defined as deleted. 55*67e74705SXin Li template<typename T> void f(decltype(T(0))*); 56*67e74705SXin Li template<typename T> int &f(...); 57*67e74705SXin Li int &r = f<C>(0); 58*67e74705SXin Li } 59