• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -Wc++11-compat %s
2 // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++98 -Wc++11-compat %s
3 // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++11 %s
4 
5 // Example from the standard
mf()6 template<class T> class Array { void mf() { } };
7 
8 template class Array<char>;
9 template void Array<int>::mf();
sort(Array<T> & v)10 template<class T> void sort(Array<T>& v) { /* ... */ }
11 template void sort(Array<char>&);
12 namespace N {
f(T &)13   template<class T> void f(T&) { }
14 }
15 template void N::f<int>(int&);
16 
17 
18 template<typename T>
19 struct X0 {
20   struct Inner {};
fX021   void f() { }
22   static T value;
23 };
24 
25 template<typename T>
26 T X0<T>::value = 17;
27 
28 typedef X0<int> XInt;
29 
30 template struct XInt::Inner; // expected-warning{{template-id}}
31 template void XInt::f(); // expected-warning{{template-id}}
32 template int XInt::value; // expected-warning{{template-id}}
33 
34 namespace N {
35   template<typename T>
36   struct X1 { // expected-note{{explicit instantiation refers here}}
37   };
38 
39   template<typename T>
f1(T)40   void f1(T) {} // expected-note{{explicit instantiation refers here}}
41 }
42 using namespace N;
43 
44 template struct X1<int>;
45 #if __cplusplus <= 199711L
46 // expected-warning@-2 {{explicit instantiation of 'N::X1' must occur in namespace 'N'}}
47 #else
48 // expected-error@-4 {{explicit instantiation of 'N::X1' must occur in namespace 'N'}}
49 #endif
50 
51 template void f1(int);
52 #if __cplusplus <= 199711L
53 // expected-warning@-2 {{explicit instantiation of 'N::f1' must occur in namespace 'N'}}
54 #else
55 // expected-error@-4 {{explicit instantiation of 'N::f1' must occur in namespace 'N'}}
56 #endif
57