xref: /aosp_15_r20/external/clang/test/SemaCXX/cxx11-inheriting-ctors.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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