diff options
Diffstat (limited to 'test/CXX/special/class.inhctor')
-rw-r--r-- | test/CXX/special/class.inhctor/elsewhere.cpp | 26 | ||||
-rw-r--r-- | test/CXX/special/class.inhctor/p3.cpp | 18 | ||||
-rw-r--r-- | test/CXX/special/class.inhctor/p7.cpp | 13 |
3 files changed, 56 insertions, 1 deletions
diff --git a/test/CXX/special/class.inhctor/elsewhere.cpp b/test/CXX/special/class.inhctor/elsewhere.cpp index 60cfff80889ea..66afa17309faa 100644 --- a/test/CXX/special/class.inhctor/elsewhere.cpp +++ b/test/CXX/special/class.inhctor/elsewhere.cpp @@ -29,3 +29,29 @@ struct I1 : B1 { struct D1 : I1 { using B1::B1; // expected-error {{'B1' is not a direct base of 'D1', can not inherit constructors}} }; + +template<typename T> struct A {}; + +template<typename T> struct B : A<bool>, A<char> { + using A<T>::A; // expected-error {{'A<double>::', which is not a base class of 'B<double>'}} +}; +B<bool> bb; +B<char> bc; +B<double> bd; // expected-note {{here}} + +template<typename T> struct C : A<T> { + using A<bool>::A; // expected-error {{'A<bool>::', which is not a base class of 'C<char>'}} +}; +C<bool> cb; +C<char> cc; // expected-note {{here}} + +template<typename T> struct D : A<T> {}; +template<typename T> struct E : D<T> { + using A<bool>::A; // expected-error {{'A<bool>' is not a direct base of 'E<bool>', can not inherit}} +}; +E<bool> eb; // expected-note {{here}} + +template<typename T> struct F : D<bool> { + using A<T>::A; // expected-error {{'A<bool>' is not a direct base of 'F<bool>'}} +}; +F<bool> fb; // expected-note {{here}} diff --git a/test/CXX/special/class.inhctor/p3.cpp b/test/CXX/special/class.inhctor/p3.cpp index 989c17c8b462f..f71ab16c0f173 100644 --- a/test/CXX/special/class.inhctor/p3.cpp +++ b/test/CXX/special/class.inhctor/p3.cpp @@ -28,3 +28,21 @@ struct D3 : B3 { // expected-note 2 {{candidate constructor}} using B3::B3; // expected-note {{candidate constructor (inherited)}} }; D3 fd3() { return 1; } // expected-error {{no viable conversion}} + +template<typename T> struct T1 : B1 { + using B1::B1; +}; +template<typename T> struct T2 : T1<T> { + using T1<int>::T1; +}; +template<typename T> struct T3 : T1<int> { + using T1<T>::T1; +}; +struct U { + friend T1<int>::T1(int); + friend T1<int>::T1(int, int); + friend T2<int>::T2(int); + friend T2<int>::T2(int, int); + friend T3<int>::T3(int); + friend T3<int>::T3(int, int); +}; diff --git a/test/CXX/special/class.inhctor/p7.cpp b/test/CXX/special/class.inhctor/p7.cpp index 736754d8a3e30..9ae160f0547ab 100644 --- a/test/CXX/special/class.inhctor/p7.cpp +++ b/test/CXX/special/class.inhctor/p7.cpp @@ -2,7 +2,7 @@ // Straight from the standard struct B1 { - B1(int); // expected-note {{previous constructor}} + B1(int); // expected-note {{previous constructor}} expected-note {{conflicting constructor}} }; struct B2 { B2(int); // expected-note {{conflicting constructor}} @@ -16,3 +16,14 @@ struct D2 : B1, B2 { using B2::B2; D2(int); }; + +template<typename T> struct B3 { + B3(T); // expected-note {{previous constructor}} +}; +template<typename T> struct B4 : B3<T>, B1 { + B4(); + using B3<T>::B3; // expected-note {{inherited here}} + using B1::B1; // expected-error {{already inherited}} +}; +B4<char> b4c; +B4<int> b4i; // expected-note {{here}} |