15f31f0893d75203c326ddcd9808099bbfe34aec0David Blaikie// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -Wc++11-compat %s 24d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor// 34d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor// Tests explicit instantiation of templates. 44d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregortemplate<typename T, typename U = T> class X0 { }; 54d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor 64d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregornamespace N { 74d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor template<typename T, typename U = T> class X1 { }; 84d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor} 94d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor 1093dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor// Check the syntax of explicit instantiations. 114d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregortemplate class X0<int, float>; 1293dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregortemplate class X0<int>; // expected-note{{previous}} 134d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor 144d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregortemplate class N::X1<int>; 154d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregortemplate class ::N::X1<int, float>; 164d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor 174d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregorusing namespace N; 184d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor 1993dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor// Check for some bogus syntax that probably means that the user 2093dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor// wanted to write an explicit specialization, but forgot the '<>' 2193dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor// after 'template'. 224d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregortemplate class X0<double> { }; // expected-error{{explicit specialization}} 2393dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor 2493dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor// Check for explicit instantiations that come after other kinds of 2593dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor// instantiations or declarations. 26ff66803b43f2ea9206637dceb793e9505f3b9c48Douglas Gregortemplate class X0<int, int>; // expected-error{{duplicate}} 2793dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor 2893dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregortemplate<> class X0<char> { }; // expected-note{{previous}} 29ff66803b43f2ea9206637dceb793e9505f3b9c48Douglas Gregortemplate class X0<char>; // expected-warning{{ignored}} 3093dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor 31ff66803b43f2ea9206637dceb793e9505f3b9c48Douglas Gregorvoid foo(X0<short>) { } 32ff66803b43f2ea9206637dceb793e9505f3b9c48Douglas Gregortemplate class X0<short>; 3393dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor 3493dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor// Check that explicit instantiations actually produce definitions. We 3593dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor// determine whether this happens by placing semantic errors in the 3693dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor// definition of the template we're instantiating. 3793dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregortemplate<typename T> struct X2; // expected-note{{declared here}} 3893dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor 3993dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregortemplate struct X2<float>; // expected-error{{undefined template}} 4093dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor 4193dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregortemplate<typename T> 4293dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregorstruct X2 { 4393dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor void f0(T*); // expected-error{{pointer to a reference}} 4493dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor}; 4593dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregor 4693dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregortemplate struct X2<int>; // okay 4793dfdb1299ef740df854f4a745dc87e5e43f0c30Douglas Gregortemplate struct X2<int&>; // expected-note{{in instantiation of}} 48a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 49a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor// Check that explicit instantiations instantiate member classes. 50a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregortemplate<typename T> struct X3 { 51f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor struct Inner { 52a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor void f(T*); // expected-error{{pointer to a reference}} 53a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor }; 54a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor}; 55a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 56a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregorvoid f1(X3<int&>); // okay, Inner, not instantiated 57a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 58a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregortemplate struct X3<int&>; // expected-note{{instantiation}} 59a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 60a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregortemplate<typename T> struct X4 { 61f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor struct Inner { 62f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor struct VeryInner { 63a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor void f(T*); // expected-error 2{{pointer to a reference}} 64a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor }; 65a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor }; 66a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor}; 67a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 68a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregorvoid f2(X4<int&>); // okay, Inner, not instantiated 69a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregorvoid f3(X4<int&>::Inner); // okay, Inner::VeryInner, not instantiated 70a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 71a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregortemplate struct X4<int&>; // expected-note{{instantiation}} 72a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregortemplate struct X4<float&>; // expected-note{{instantiation}} 733f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor 743f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor// Check explicit instantiation of member classes 753f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregornamespace N2 { 763f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor 773f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregortemplate<typename T> 783f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregorstruct X5 { 793f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor struct Inner1 { 803f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor void f(T&); 813f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor }; 823f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor 833e2e91e934ecf083a7c0835b58d9627ca2faddc9Richard Smith struct Inner2 { // expected-note {{here}} 84f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor struct VeryInner { 853f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor void g(T*); // expected-error 2{{pointer to a reference}} 863f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor }; 873f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor }; 883f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor}; 893f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor 903f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor} 913f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor 923f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregortemplate struct N2::X5<void>::Inner2; 933f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor 943f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregorusing namespace N2; 953f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregortemplate struct X5<int&>::Inner2; // expected-note{{instantiation}} 963f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor 973f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregorvoid f4(X5<float&>::Inner2); 983f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregortemplate struct X5<float&>::Inner2; // expected-note{{instantiation}} 993f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor 1003f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregornamespace N3 { 1013e2e91e934ecf083a7c0835b58d9627ca2faddc9Richard Smith template struct N2::X5<int>::Inner2; // expected-warning {{explicit instantiation of 'Inner2' not in a namespace enclosing 'N2'}} 1023f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor} 1033f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor 1043f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregorstruct X6 { 1053f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor struct Inner { // expected-note{{here}} 1063f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor void f(); 1073f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor }; 1083f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor}; 1093f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor 1103f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregortemplate struct X6::Inner; // expected-error{{non-templated}} 1113ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregor 1123ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregor// PR5559 1133ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregortemplate <typename T> 1143ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregorstruct Foo; 1153ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregor 1163ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregortemplate <> 1173ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregorstruct Foo<int> // expected-note{{header not required for explicitly-specialized}} 1183ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregor{ 1193ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregor template <typename U> 1203ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregor struct Bar 1213ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregor {}; 1223ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregor}; 1233ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregor 1243ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregortemplate <> // expected-warning{{extraneous template parameter list}} 1253ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregortemplate <> 1263ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregorstruct Foo<int>::Bar<void> 1273ebd75399112dd9ad1c96ee5e7c59df580378cc8Douglas Gregor{}; 1282166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor 1292166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregornamespace N1 { 1302166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor 1312166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor template<typename T> struct X7 { }; // expected-note{{here}} 1322166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor 1332166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor namespace Inner { 1342166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor template<typename T> struct X8 { }; 1352166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor } 1362166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor 1372166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor template struct X7<int>; 1382166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor template struct Inner::X8<int>; 1392166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor} 1402166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor 1412166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregortemplate<typename T> struct X9 { }; // expected-note{{here}} 1422166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor 1432166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregortemplate struct ::N1::Inner::X8<float>; 1442166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor 1452166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregornamespace N2 { 1462166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor using namespace N1; 1472166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor 1482166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor template struct X7<double>; // expected-warning{{must occur in namespace}} 1492166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor 1503e2e91e934ecf083a7c0835b58d9627ca2faddc9Richard Smith template struct X9<float>; // expected-warning{{must occur at global scope}} 1512166beba8d939d2938c5401af2c8d3687afd5d8cDouglas Gregor} 152