| 1 | // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s |
| 2 | |
| 3 | // Tests related to constructor inheriting, but not specified in [class.inhctor] |
| 4 | |
| 5 | // [namespace.udecl]p8: |
| 6 | // A using-declaration for a class member shall be a member-declaration. |
| 7 | |
| 8 | struct B1 { |
| 9 | B1(int); |
| 10 | }; |
| 11 | |
| 12 | using B1::B1; // expected-error {{using declaration cannot refer to class member}} |
| 13 | |
| 14 | // C++11 [namespace.udecl]p10: |
| 15 | // A using-declaration is a declaration and can therefore be used repeatedly |
| 16 | // where (and only where) multiple declarations are allowed. |
| 17 | |
| 18 | struct I1 : B1 { |
| 19 | using B1::B1; // expected-note {{previous using declaration}} |
| 20 | using B1::B1; // expected-error {{redeclaration of using decl}} |
| 21 | }; |
| 22 | |
| 23 | // C++11 [namespace.udecl]p3: |
| 24 | // In a using declaration used as a member-declaration, the nested-name- |
| 25 | // specifier shall name a base class of the class being defined. |
| 26 | // If such a using-declaration names a constructor, the nested-name-specifier |
| 27 | // shall name a direct base class of the class being defined. |
| 28 | |
| 29 | struct D1 : I1 { |
| 30 | using B1::B1; // expected-error {{'B1' is not a direct base of 'D1', cannot inherit constructors}} |
| 31 | }; |
| 32 | |
| 33 | template<typename T> struct A {}; |
| 34 | |
| 35 | template<typename T> struct B : A<bool>, A<char> { |
| 36 | using A<T>::A; // expected-error {{'A<double>::', which is not a base class of 'B<double>'}} |
| 37 | }; |
| 38 | B<bool> bb; |
| 39 | B<char> bc; |
| 40 | B<double> bd; // expected-note {{here}} |
| 41 | |
| 42 | template<typename T> struct C : A<T> { |
| 43 | using A<bool>::A; // expected-error {{'A<bool>::', which is not a base class of 'C<char>'}} |
| 44 | }; |
| 45 | C<bool> cb; |
| 46 | C<char> cc; // expected-note {{here}} |
| 47 | |
| 48 | template<typename T> struct D : A<T> {}; |
| 49 | template<typename T> struct E : D<T> { |
| 50 | using A<bool>::A; // expected-error {{'A<bool>' is not a direct base of 'E<bool>', cannot inherit}} |
| 51 | }; |
| 52 | E<bool> eb; // expected-note {{here}} |
| 53 | |
| 54 | template<typename T> struct F : D<bool> { |
| 55 | using A<T>::A; // expected-error {{'A<bool>' is not a direct base of 'F<bool>'}} |
| 56 | }; |
| 57 | F<bool> fb; // expected-note {{here}} |
| 58 | |
| 59 | template<typename T> |
| 60 | struct G : T { |
| 61 | using T::T; |
| 62 | G(int &) : G(0) {} |
| 63 | }; |
| 64 | G<B1> g(123); |
| 65 | |