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