14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 -Wundefined-func-template %s 24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <class T> struct C1 { 44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static char s_var_1; // expected-note{{forward declaration of template entity is here}} 54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static char s_var_2; // expected-note{{forward declaration of template entity is here}} 64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static void s_func_1(); // expected-note{{forward declaration of template entity is here}} 74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static void s_func_2(); // expected-note{{forward declaration of template entity is here}} 84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void meth_1(); // expected-note2{{forward declaration of template entity is here}} 94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void meth_2(); 104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar template <class T1> static char s_tvar_2; // expected-note{{forward declaration of template entity is here}} 114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar template <class T1> static void s_tfunc_2(); // expected-note{{forward declaration of template entity is here}} 124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar template<typename T1> struct C2 { 134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static char s_var_2; // expected-note{{forward declaration of template entity is here}} 144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static void s_func_2(); // expected-note{{forward declaration of template entity is here}} 154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void meth_2(); // expected-note{{forward declaration of template entity is here}} 164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar template <class T2> static char s_tvar_2; // expected-note{{forward declaration of template entity is here}} 174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar template <class T2> void tmeth_2(); // expected-note{{forward declaration of template entity is here}} 184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar }; 194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarextern template char C1<int>::s_var_2; 224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarextern template void C1<int>::s_func_2(); 234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarextern template void C1<int>::meth_2(); 244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarextern template char C1<int>::s_tvar_2<char>; 254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarextern template void C1<int>::s_tfunc_2<char>(); 264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarextern template void C1<int>::C2<long>::s_var_2; 274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarextern template void C1<int>::C2<long>::s_func_2(); 284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarextern template void C1<int>::C2<long>::meth_2(); 294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarextern template char C1<int>::C2<long>::s_tvar_2<char>; 304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarextern template void C1<int>::C2<long>::tmeth_2<char>(); 314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarchar func_01() { 334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return C1<int>::s_var_2; 344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarchar func_02() { 374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return C1<int>::s_var_1; // expected-warning{{instantiation of variable 'C1<int>::s_var_1' required here, but no definition is available}} 384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<int>::s_var_1' is explicitly instantiated in another translation unit}} 394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarchar func_03() { 424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return C1<char>::s_var_2; // expected-warning{{instantiation of variable 'C1<char>::s_var_2' required here, but no definition is available}} 434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<char>::s_var_2' is explicitly instantiated in another translation unit}} 444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_04() { 474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar C1<int>::s_func_1(); // expected-warning{{instantiation of function 'C1<int>::s_func_1' required here, but no definition is available}} 484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<int>::s_func_1' is explicitly instantiated in another translation unit}} 494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_05() { 524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar C1<int>::s_func_2(); 534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_06() { 564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar C1<char>::s_func_2(); // expected-warning{{instantiation of function 'C1<char>::s_func_2' required here, but no definition is available}} 574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<char>::s_func_2' is explicitly instantiated in another translation unit}} 584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_07(C1<int> *x) { 614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar x->meth_1(); // expected-warning{{instantiation of function 'C1<int>::meth_1' required here, but no definition is available}} 624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<int>::meth_1' is explicitly instantiated in another translation unit}} 634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_08(C1<int> *x) { 664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar x->meth_2(); 674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_09(C1<char> *x) { 704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar x->meth_1(); // expected-warning{{instantiation of function 'C1<char>::meth_1' required here, but no definition is available}} 714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<char>::meth_1' is explicitly instantiated in another translation unit}} 724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarchar func_10() { 754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return C1<int>::s_tvar_2<char>; 764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarchar func_11() { 794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return C1<int>::s_tvar_2<long>; // expected-warning{{instantiation of variable 'C1<int>::s_tvar_2<long>' required here, but no definition is available}} 804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<int>::s_tvar_2<long>' is explicitly instantiated in another translation unit}} 814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_12() { 844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar C1<int>::s_tfunc_2<char>(); 854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_13() { 884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar C1<int>::s_tfunc_2<long>(); // expected-warning{{instantiation of function 'C1<int>::s_tfunc_2<long>' required here, but no definition is available}} 894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<int>::s_tfunc_2<long>' is explicitly instantiated in another translation unit}} 904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarchar func_14() { 934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return C1<int>::C2<long>::s_var_2; 944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarchar func_15() { 974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return C1<int>::C2<char>::s_var_2; //expected-warning {{instantiation of variable 'C1<int>::C2<char>::s_var_2' required here, but no definition is available}} 984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<int>::C2<char>::s_var_2' is explicitly instantiated in another translation unit}} 994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_16() { 1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar C1<int>::C2<long>::s_func_2(); 1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_17() { 1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar C1<int>::C2<char>::s_func_2(); // expected-warning{{instantiation of function 'C1<int>::C2<char>::s_func_2' required here, but no definition is available}} 1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<int>::C2<char>::s_func_2' is explicitly instantiated in another translation unit}} 1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_18(C1<int>::C2<long> *x) { 1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar x->meth_2(); 1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_19(C1<int>::C2<char> *x) { 1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar x->meth_2(); // expected-warning{{instantiation of function 'C1<int>::C2<char>::meth_2' required here, but no definition is available}} 1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<int>::C2<char>::meth_2' is explicitly instantiated in another translation unit}} 1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarchar func_20() { 1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return C1<int>::C2<long>::s_tvar_2<char>; 1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarchar func_21() { 1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return C1<int>::C2<long>::s_tvar_2<long>; // expected-warning{{instantiation of variable 'C1<int>::C2<long>::s_tvar_2<long>' required here, but no definition is available}} 1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<int>::C2<long>::s_tvar_2<long>' is explicitly instantiated in another translation unit}} 1264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_22(C1<int>::C2<long> *x) { 1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar x->tmeth_2<char>(); 1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func_23(C1<int>::C2<long> *x) { 1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar x->tmeth_2<int>(); // expected-warning{{instantiation of function 'C1<int>::C2<long>::tmeth_2<int>' required here, but no definition is available}} 1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // expected-note@-1{{add an explicit instantiation declaration to suppress this warning if 'C1<int>::C2<long>::tmeth_2<int>' is explicitly instantiated in another translation unit}} 1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint main() { 1384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return 0; 1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 140