1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s -Wno-c++1y-extensions 2a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 3a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// This test creates cases where implicit instantiations of various entities 4a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// would cause a diagnostic, but provides expliict specializations for those 5a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// entities that avoid the diagnostic. The specializations are alternately 6a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// declarations and definitions, and the intent of this test is to verify 7a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// that we allow specializations only in the appropriate namespaces (and 8a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// nowhere else). 9a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct NonDefaultConstructible { 10a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor NonDefaultConstructible(int); 11a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}; 12a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// FIXME: The "must originally be declared in namespace" diagnostics throughout 14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// this file are wrong. 15a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 16a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// C++ [temp.expl.spec]p1: 17a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// An explicit specialization of any of the following: 18a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 19a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// -- function template 20a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 { 21a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<typename T> void f0(T) { 22a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor T t; 23a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor } 24a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 25a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> void f0(NonDefaultConstructible) { } 26a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 27a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor void test_f0(NonDefaultConstructible NDC) { 28a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor f0(NDC); 29a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor } 30a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 31a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> void f0(int); 32a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> void f0(long); 33a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 34a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 35a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> void N0::f0(int) { } // okay 36a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 37a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N1 { 38a1c4f7c833093f87d5187c4449a3d4534cfa40a4Richard Smith template<> void N0::f0(long) { } // expected-error{{does not enclose namespace}} 39a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 40a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 41a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> void N0::f0(double) { } 42a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 43a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct X1 { 44a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<typename T> void f(T); 45a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 46a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> void f(int); // expected-error{{in class scope}} 47a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}; 48a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 49a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// -- class template 50a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 { 51a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 52a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<typename T> 53a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct X0 { // expected-note {{here}} 54a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor static T member; 55a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 56a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor void f1(T t) { 57a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor t = 17; 58a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor } 59a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 60a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct Inner : public T { }; // expected-note 2{{here}} 61a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 62a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<typename U> 63a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct InnerTemplate : public T { }; // expected-note 1{{explicitly specialized}} \ 64a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor // expected-error{{base specifier}} 65a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 66a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<typename U> 67a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor void ft1(T t, U u); 68a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}; 69a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 70a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 71a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 72a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<typename T> 73a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<typename U> 74a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorvoid N0::X0<T>::ft1(T t, U u) { 75a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor t = u; 76a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 77a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 78a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<typename T> T N0::X0<T>::member; 79a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 80a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> struct N0::X0<void> { }; 81a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<void> test_X0; 82a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 83a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N1 { 84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<> struct N0::X0<const void> { }; // expected-error{{class template specialization of 'X0' not in a namespace enclosing 'N0'}} 85a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 86a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 87a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 { 88a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> struct X0<volatile void>; 89a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 90a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 91a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> struct N0::X0<volatile void> { 92a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor void f1(void *); 93a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}; 94a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// -- variable template [C++1y] 96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace N0 { 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<typename T> int v0; // expected-note +{{here}} 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v0<char[1]>; 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v0<char[2]>; 100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v0<char[5]>; 101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v0<char[6]>; 102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesusing N0::v0; 104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<typename T> int v1; // expected-note +{{here}} 106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v1<char[3]>; 107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v1<char[4]>; 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v1<char[7]>; 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v1<char[8]>; 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int N0::v0<int[1]>; 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v0<int[2]>; // FIXME: ill-formed 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int ::v1<int[3]>; // expected-warning {{extra qualification}} 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v1<int[4]>; 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int N0::v0<char[1]>; 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v0<char[2]>; // FIXME: ill-formed 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int ::v1<char[3]>; // expected-warning {{extra qualification}} 119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v1<char[4]>; 120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace N1 { 122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int N0::v0<int[5]>; // expected-error {{must originally be declared in namespace 'N0'}} expected-error {{does not enclose namespace}} 123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v0<int[6]>; // expected-error {{must originally be declared in namespace 'N0'}} 124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int ::v1<int[7]>; // expected-error {{must originally be declared in the global scope}} expected-error {{cannot name the global scope}} 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v1<int[8]>; // expected-error {{must originally be declared in the global scope}} 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int N0::v0<char[5]>; // expected-error {{does not enclose namespace 'N0'}} 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v0<char[6]>; // FIXME: ill-formed 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int ::v1<char[7]>; // expected-error {{cannot name the global scope}} 130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v1<char[8]>; // FIXME: ill-formed 131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 133a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// -- member function of a class template 134a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> void N0::X0<void*>::f1(void *) { } 135a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 136a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorvoid test_spec(N0::X0<void*> xvp, void *vp) { 137a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor xvp.f1(vp); 138a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 139a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 140a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 { 141a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> void X0<volatile void>::f1(void *) { } // expected-error{{no function template matches}} 142a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 143a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> void X0<const volatile void*>::f1(const volatile void*); 144a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 145a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 146a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorvoid test_x0_cvvoid(N0::X0<const volatile void*> x0, const volatile void *cvp) { 147a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor x0.f1(cvp); // okay: we've explicitly specialized 148a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 149a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 150a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// -- static data member of a class template 151a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 { 152a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor // This actually tests p15; the following is a declaration, not a definition. 153a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> 154a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor NonDefaultConstructible X0<NonDefaultConstructible>::member; 155a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 156a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> long X0<long>::member = 17; 157a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 158a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> float X0<float>::member; 159a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 160a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> double X0<double>::member; 161a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 162a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 163a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorNonDefaultConstructible &get_static_member() { 164a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor return N0::X0<NonDefaultConstructible>::member; 165a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 166a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 167a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> int N0::X0<int>::member; 168a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 169a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> float N0::X0<float>::member = 3.14f; 170a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 171a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N1 { 172a1c4f7c833093f87d5187c4449a3d4534cfa40a4Richard Smith template<> double N0::X0<double>::member = 3.14; // expected-error{{does not enclose namespace}} 173a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 174a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 175a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// -- member class of a class template 176a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 { 177a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 178a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> 179a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct X0<void*>::Inner { }; 180a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 181a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> 182a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct X0<int>::Inner { }; 183a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 184a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> 185a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct X0<unsigned>::Inner; 186a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 187a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> 188a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct X0<float>::Inner; 189a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 190a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> 191a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct X0<double>::Inner; // expected-note{{forward declaration}} 192a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 193a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 194a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> 195a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct N0::X0<long>::Inner { }; 196a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 197a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> 198a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct N0::X0<float>::Inner { }; 199a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 200a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N1 { 201a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> 202a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct N0::X0<unsigned>::Inner { }; // expected-error{{member class specialization}} 203a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 204a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> 205a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct N0::X0<unsigned long>::Inner { }; // expected-error{{member class specialization}} 206a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}; 207a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 208a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<void*>::Inner inner0; 209a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<int>::Inner inner1; 210a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<long>::Inner inner2; 211a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<float>::Inner inner3; 212a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<double>::Inner inner4; // expected-error{{incomplete}} 213a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 214a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// -- member class template of a class template 215a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 { 216a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> 217a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> 218a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct X0<void*>::InnerTemplate<int> { }; 219a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 220a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> template<> 221a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct X0<int>::InnerTemplate<int>; // expected-note{{forward declaration}} 222a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 223a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> template<> 224a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct X0<int>::InnerTemplate<long>; 225a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 226a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> template<> 227a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct X0<int>::InnerTemplate<double>; 228a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 229a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 230a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> template<> 231a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct N0::X0<int>::InnerTemplate<long> { }; // okay 232a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 233a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> template<> 234a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct N0::X0<int>::InnerTemplate<float> { }; 235a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 236a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N1 { 237a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> template<> 238a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor struct N0::X0<int>::InnerTemplate<double> { }; // expected-error{{enclosing}} 239a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 240a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 241a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<void*>::InnerTemplate<int> inner_template0; 242a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<int>::InnerTemplate<int> inner_template1; // expected-error{{incomplete}} 243a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<int>::InnerTemplate<long> inner_template2; 244a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<int>::InnerTemplate<unsigned long> inner_template3; // expected-note{{instantiation}} 245a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 246a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// -- member function template of a class template 247a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 { 248a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> 249a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> 250a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor void X0<void*>::ft1(void*, const void*) { } 251a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 252a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> template<> 253a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor void X0<void*>::ft1(void *, int); 254a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 255a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> template<> 256a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor void X0<void*>::ft1(void *, unsigned); 257a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 258a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> template<> 259a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor void X0<void*>::ft1(void *, long); 260a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 261a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 262a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> template<> 263a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorvoid N0::X0<void*>::ft1(void *, unsigned) { } // okay 264a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 265a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> template<> 266a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorvoid N0::X0<void*>::ft1(void *, float) { } 267a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 268a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N1 { 269a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor template<> template<> 270a1c4f7c833093f87d5187c4449a3d4534cfa40a4Richard Smith void N0::X0<void*>::ft1(void *, long) { } // expected-error{{does not enclose namespace}} 271a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 272a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 273a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor 274a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorvoid test_func_template(N0::X0<void *> xvp, void *vp, const void *cvp, 275a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor int i, unsigned u) { 276a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor xvp.ft1(vp, cvp); 277a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor xvp.ft1(vp, i); 278a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor xvp.ft1(vp, u); 279a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor} 280cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 281cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregornamespace has_inline_namespaces { 282cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor inline namespace inner { 283cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor template<class T> void f(T&); 284cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 285cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor template<class T> 286cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor struct X0 { 287cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor struct MemberClass; 288cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 289cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor void mem_func(); 290cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 291cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor template<typename U> 292cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor struct MemberClassTemplate; 293cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 294cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor template<typename U> 295cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor void mem_func_template(U&); 296cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 297cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor static int value; 298cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor }; 299cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor } 300cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 301cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor struct X1; 302cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor struct X2; 303cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 304cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor // An explicit specialization whose declarator-id is not qualified 305cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor // shall be declared in the nearest enclosing namespace of the 306cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor // template, or, if the namespace is inline (7.3.1), any namespace 307cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor // from its enclosing namespace set. 308cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor template<> void f(X1&); 309cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor template<> void f<X2>(X2&); 310cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 311cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor template<> struct X0<X1> { }; 312cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 313cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor template<> struct X0<X2>::MemberClass { }; 314cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 315cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor template<> void X0<X2>::mem_func(); 316cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 317cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor template<> template<typename T> struct X0<X2>::MemberClassTemplate { }; 318cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 319cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor template<> template<typename T> void X0<X2>::mem_func_template(T&) { } 320cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 321cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor template<> int X0<X2>::value = 12; 322cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor} 323cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 324cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregorstruct X3; 325cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregorstruct X4; 326cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 327cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> void has_inline_namespaces::f(X3&); 328cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> void has_inline_namespaces::f<X4>(X4&); 329cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 330cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> struct has_inline_namespaces::X0<X3> { }; 331cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 332cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> struct has_inline_namespaces::X0<X4>::MemberClass { }; 333cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 334cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> void has_inline_namespaces::X0<X4>::mem_func(); 335cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 336cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> template<typename T> 337cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregorstruct has_inline_namespaces::X0<X4>::MemberClassTemplate { }; 338cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 339cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> template<typename T> 340cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregorvoid has_inline_namespaces::X0<X4>::mem_func_template(T&) { } 341cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor 342cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> int has_inline_namespaces::X0<X4>::value = 13; 343459455b9868974e2bb98032f768fe111ff376adaDavid Blaikie 344459455b9868974e2bb98032f768fe111ff376adaDavid Blaikienamespace PR12938 { 345459455b9868974e2bb98032f768fe111ff376adaDavid Blaikie template<typename> [[noreturn]] void func(); 346459455b9868974e2bb98032f768fe111ff376adaDavid Blaikie template<> void func<int>(); 347459455b9868974e2bb98032f768fe111ff376adaDavid Blaikie} 348