1f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// RUN: %clang_cc1 -std=c++11 -verify %s 2f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 3f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// The implicit specialization of a class template specialuzation causes the 4f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// implicit instantiation of the declarations, but not the definitions or 5f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// default arguments, of: 6f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 7f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// FIXME: Many omitted cases 8f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 9f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// - scoped member enumerations 10f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smithnamespace ScopedEnum { 11f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> struct ScopedEnum1 { 12f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum class E { 13f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = T::error // expected-error {{'double' cannot be used prior to '::'}} 14f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 15f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 16f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith ScopedEnum1<int> se1; // ok 17f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 18f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> struct ScopedEnum2 { 19f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum class E : T { // expected-error {{non-integral type 'void *' is an invalid underlying type}} 20f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = 0 21f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 22f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 23f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith ScopedEnum2<void*> se2; // expected-note {{here}} 24f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 25f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> struct UnscopedEnum3 { 26f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum class E : T { 27f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = 4 28f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 29f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int arr[(int)E::e]; 30f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 31f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith UnscopedEnum3<int> ue3; // ok 32f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 33f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith ScopedEnum1<double>::E e1; // ok 34f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith ScopedEnum1<double>::E e2 = decltype(e2)::e; // expected-note {{in instantiation of enumeration 'ScopedEnum::ScopedEnum1<double>::E' requested here}} 35f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 3657907e56191adea0fa870c052054eb0fe0c4681fBill Wendling // DR1484 specifies that enumerations cannot be separately instantiated, 3757907e56191adea0fa870c052054eb0fe0c4681fBill Wendling // they will be instantiated with the rest of the template declaration. 38f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> 39f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int f() { 40f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum class E { 4157907e56191adea0fa870c052054eb0fe0c4681fBill Wendling e = T::error // expected-error {{has no members}} 42f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 43f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith return (int)E(); 44f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith } 4557907e56191adea0fa870c052054eb0fe0c4681fBill Wendling int test1 = f<int>(); // expected-note {{here}} 46f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 47f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> 48f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int g() { 49f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum class E { 50f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = T::error // expected-error {{has no members}} 51f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 5257907e56191adea0fa870c052054eb0fe0c4681fBill Wendling return E::e; 53f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith } 54f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int test2 = g<int>(); // expected-note {{here}} 55f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith} 56f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// - static data members 584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace StaticDataMembers { 594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar template<typename T> 604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct A { 614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static const int n = T::error; // expected-error {{has no members}} 624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static inline int m = T::error; // expected-warning {{extension}} 634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar }; 644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar A<int> ai; // expected-note {{here}} 654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 67f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// And it cases the implicit instantiations of the definitions of: 68f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 69f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// - unscoped member enumerations 70f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smithnamespace UnscopedEnum { 71f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> struct UnscopedEnum1 { 72f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum E { 73f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = T::error // expected-error {{'int' cannot be used prior to '::'}} 74f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 75f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 76f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith UnscopedEnum1<int> ue1; // expected-note {{here}} 77f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 78f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> struct UnscopedEnum2 { 79f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum E : T { // expected-error {{non-integral type 'void *' is an invalid underlying type}} 80f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = 0 81f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 82f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 83f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith UnscopedEnum2<void*> ue2; // expected-note {{here}} 84f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 85f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> struct UnscopedEnum3 { 86f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum E : T { 87f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = 4 88f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 89f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int arr[E::e]; 90f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 91f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith UnscopedEnum3<int> ue3; // ok 92f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 93f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> 94f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int f() { 95f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum E { 96f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = T::error // expected-error {{has no members}} 97f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 98f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith return (int)E(); 99f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith } 100f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int test1 = f<int>(); // expected-note {{here}} 101f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 102f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> 103f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int g() { 104f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum E { 105f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = T::error // expected-error {{has no members}} 106f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 107f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith return E::e; 108f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith } 109f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int test2 = g<int>(); // expected-note {{here}} 110f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith} 111f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 112f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// FIXME: 113f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith//- - member anonymous unions 114