1// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -Wc++11-compat %s 2// 3// Tests explicit instantiation of templates. 4template<typename T, typename U = T> class X0 { }; 5 6namespace N { 7 template<typename T, typename U = T> class X1 { }; 8} 9 10// Check the syntax of explicit instantiations. 11template class X0<int, float>; 12template class X0<int>; // expected-note{{previous}} 13 14template class N::X1<int>; 15template class ::N::X1<int, float>; 16 17using namespace N; 18 19// Check for some bogus syntax that probably means that the user 20// wanted to write an explicit specialization, but forgot the '<>' 21// after 'template'. 22template class X0<double> { }; // expected-error{{explicit specialization}} 23 24// Check for explicit instantiations that come after other kinds of 25// instantiations or declarations. 26template class X0<int, int>; // expected-error{{duplicate}} 27 28template<> class X0<char> { }; // expected-note{{previous}} 29template class X0<char>; // expected-warning{{ignored}} 30 31void foo(X0<short>) { } 32template class X0<short>; 33 34// Check that explicit instantiations actually produce definitions. We 35// determine whether this happens by placing semantic errors in the 36// definition of the template we're instantiating. 37template<typename T> struct X2; // expected-note{{declared here}} 38 39template struct X2<float>; // expected-error{{undefined template}} 40 41template<typename T> 42struct X2 { 43 void f0(T*); // expected-error{{pointer to a reference}} 44}; 45 46template struct X2<int>; // okay 47template struct X2<int&>; // expected-note{{in instantiation of}} 48 49// Check that explicit instantiations instantiate member classes. 50template<typename T> struct X3 { 51 struct Inner { 52 void f(T*); // expected-error{{pointer to a reference}} 53 }; 54}; 55 56void f1(X3<int&>); // okay, Inner, not instantiated 57 58template struct X3<int&>; // expected-note{{instantiation}} 59 60template<typename T> struct X4 { 61 struct Inner { 62 struct VeryInner { 63 void f(T*); // expected-error 2{{pointer to a reference}} 64 }; 65 }; 66}; 67 68void f2(X4<int&>); // okay, Inner, not instantiated 69void f3(X4<int&>::Inner); // okay, Inner::VeryInner, not instantiated 70 71template struct X4<int&>; // expected-note{{instantiation}} 72template struct X4<float&>; // expected-note{{instantiation}} 73 74// Check explicit instantiation of member classes 75namespace N2 { 76 77template<typename T> 78struct X5 { 79 struct Inner1 { 80 void f(T&); 81 }; 82 83 struct Inner2 { // expected-note {{here}} 84 struct VeryInner { 85 void g(T*); // expected-error 2{{pointer to a reference}} 86 }; 87 }; 88}; 89 90} 91 92template struct N2::X5<void>::Inner2; 93 94using namespace N2; 95template struct X5<int&>::Inner2; // expected-note{{instantiation}} 96 97void f4(X5<float&>::Inner2); 98template struct X5<float&>::Inner2; // expected-note{{instantiation}} 99 100namespace N3 { 101 template struct N2::X5<int>::Inner2; // expected-warning {{explicit instantiation of 'Inner2' not in a namespace enclosing 'N2'}} 102} 103 104struct X6 { 105 struct Inner { // expected-note{{here}} 106 void f(); 107 }; 108}; 109 110template struct X6::Inner; // expected-error{{non-templated}} 111 112// PR5559 113template <typename T> 114struct Foo; 115 116template <> 117struct Foo<int> // expected-note{{header not required for explicitly-specialized}} 118{ 119 template <typename U> 120 struct Bar 121 {}; 122}; 123 124template <> // expected-warning{{extraneous template parameter list}} 125template <> 126struct Foo<int>::Bar<void> 127{}; 128 129namespace N1 { 130 131 template<typename T> struct X7 { }; // expected-note{{here}} 132 133 namespace Inner { 134 template<typename T> struct X8 { }; 135 } 136 137 template struct X7<int>; 138 template struct Inner::X8<int>; 139} 140 141template<typename T> struct X9 { }; // expected-note{{here}} 142 143template struct ::N1::Inner::X8<float>; 144 145namespace N2 { 146 using namespace N1; 147 148 template struct X7<double>; // expected-warning{{must occur in namespace}} 149 150 template struct X9<float>; // expected-warning{{must occur at global scope}} 151} 152