1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2 3 // Inherit a valid non-default ctor. 4 namespace NonDefaultCtorValid { 5 struct A { ANonDefaultCtorValid::A6 A(const int &x) {} 7 }; 8 9 struct B : A { 10 using A::A; 11 }; 12 13 struct C { 14 struct B b; CNonDefaultCtorValid::C15 C() : b(0) {} 16 }; 17 test()18 void test() { 19 B b(0); 20 C c; 21 } 22 } 23 24 // Inherit an invalid non-default ctor. 25 // The inherited ctor is invalid because it is unable to initialize s. 26 namespace NonDefaultCtorInvalid { 27 struct S { 28 S() = delete; 29 }; 30 struct A { ANonDefaultCtorInvalid::A31 A(const int &x) {} 32 }; 33 34 struct B : A { 35 using A::A; 36 S s; 37 }; 38 39 struct C { 40 struct B b; CNonDefaultCtorInvalid::C41 C() : b(0) {} // expected-error{{constructor inherited by 'B' from base class 'A' is implicitly deleted}} 42 // expected-note@-6{{constructor inherited by 'B' is implicitly deleted because field 's' has a deleted corresponding constructor}} 43 // expected-note@-15{{'S' has been explicitly marked deleted here}} 44 }; 45 } 46 47 // Inherit a valid default ctor. 48 namespace DefaultCtorValid { 49 struct A { ADefaultCtorValid::A50 A() {} 51 }; 52 53 struct B : A { 54 using A::A; 55 }; 56 57 struct C { 58 struct B b; CDefaultCtorValid::C59 C() {} 60 }; 61 test()62 void test() { 63 B b; 64 C c; 65 } 66 } 67 68 // Inherit an invalid default ctor. 69 // The inherited ctor is invalid because it is unable to initialize s. 70 namespace DefaultCtorInvalid { 71 struct S { 72 S() = delete; 73 }; 74 struct A { ADefaultCtorInvalid::A75 A() {} 76 }; 77 78 struct B : A { 79 using A::A; 80 S s; 81 }; 82 83 struct C { 84 struct B b; CDefaultCtorInvalid::C85 C() {} // expected-error{{call to implicitly-deleted default constructor of 'struct B'}} 86 // expected-note@-6{{default constructor of 'B' is implicitly deleted because field 's' has a deleted default constructor}} 87 // expected-note@-15{{'S' has been explicitly marked deleted here}} 88 }; 89 } 90