| // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s |
| |
| // Inherit a valid non-default ctor. |
| namespace NonDefaultCtorValid { |
| struct A { |
| A(const int &x) {} |
| }; |
| |
| struct B : A { |
| using A::A; |
| }; |
| |
| struct C { |
| struct B b; |
| C() : b(0) {} |
| }; |
| |
| void test() { |
| B b(0); |
| C c; |
| } |
| } |
| |
| // Inherit an invalid non-default ctor. |
| // The inherited ctor is invalid because it is unable to initialize s. |
| namespace NonDefaultCtorInvalid { |
| struct S { |
| S() = delete; |
| }; |
| struct A { |
| A(const int &x) {} |
| }; |
| |
| struct B : A { |
| using A::A; |
| S s; |
| }; |
| |
| struct C { |
| struct B b; |
| C() : b(0) {} // expected-error{{constructor inherited by 'B' from base class 'A' is implicitly deleted}} |
| // expected-note@-6{{constructor inherited by 'B' is implicitly deleted because field 's' has a deleted corresponding constructor}} |
| // expected-note@-15{{'S' has been explicitly marked deleted here}} |
| }; |
| } |
| |
| // Inherit a valid default ctor. |
| namespace DefaultCtorValid { |
| struct A { |
| A() {} |
| }; |
| |
| struct B : A { |
| using A::A; |
| }; |
| |
| struct C { |
| struct B b; |
| C() {} |
| }; |
| |
| void test() { |
| B b; |
| C c; |
| } |
| } |
| |
| // Inherit an invalid default ctor. |
| // The inherited ctor is invalid because it is unable to initialize s. |
| namespace DefaultCtorInvalid { |
| struct S { |
| S() = delete; |
| }; |
| struct A { |
| A() {} |
| }; |
| |
| struct B : A { |
| using A::A; |
| S s; |
| }; |
| |
| struct C { |
| struct B b; |
| C() {} // expected-error{{call to implicitly-deleted default constructor of 'struct B'}} |
| // expected-note@-6{{default constructor of 'B' is implicitly deleted because field 's' has a deleted default constructor}} |
| // expected-note@-15{{'S' has been explicitly marked deleted here}} |
| }; |
| } |