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 57f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// And it cases the implicit instantiations of the definitions of: 58f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 59f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// - unscoped member enumerations 60f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smithnamespace UnscopedEnum { 61f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> struct UnscopedEnum1 { 62f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum E { 63f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = T::error // expected-error {{'int' cannot be used prior to '::'}} 64f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 65f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 66f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith UnscopedEnum1<int> ue1; // expected-note {{here}} 67f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 68f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> struct UnscopedEnum2 { 69f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum E : T { // expected-error {{non-integral type 'void *' is an invalid underlying type}} 70f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = 0 71f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 72f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 73f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith UnscopedEnum2<void*> ue2; // expected-note {{here}} 74f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 75f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> struct UnscopedEnum3 { 76f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum E : T { 77f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = 4 78f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 79f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int arr[E::e]; 80f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 81f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith UnscopedEnum3<int> ue3; // ok 82f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 83f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> 84f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int f() { 85f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum E { 86f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = T::error // expected-error {{has no members}} 87f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 88f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith return (int)E(); 89f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith } 90f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int test1 = f<int>(); // expected-note {{here}} 91f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 92f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith template<typename T> 93f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int g() { 94f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum E { 95f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = T::error // expected-error {{has no members}} 96f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 97f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith return E::e; 98f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith } 99f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith int test2 = g<int>(); // expected-note {{here}} 100f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith} 101f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 102f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// FIXME: 103f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith//- - member anonymous unions 104