1 | // RUN: %clang_cc1 -std=c++11 -verify %s |
2 | // expected-no-diagnostics |
3 | |
4 | // If the name declared in the explicit instantiation is an |
5 | // unqualified name, the explicit instantiation shall appear in the |
6 | // namespace where its template is declared or, if that namespace is |
7 | // inline (7.3.1), any namespace from its enclosing namespace set. |
8 | |
9 | namespace has_inline_namespaces { |
10 | inline namespace inner { |
11 | template<class T> void f(T&) {} |
12 | |
13 | template<class T> |
14 | struct X0 { |
15 | struct MemberClass {}; |
16 | |
17 | void mem_func() {} |
18 | |
19 | template<typename U> |
20 | struct MemberClassTemplate {}; |
21 | |
22 | template<typename U> |
23 | void mem_func_template(U&) {} |
24 | |
25 | static int value; |
26 | }; |
27 | } |
28 | |
29 | template<typename T> int X0<T>::value = 17; |
30 | |
31 | struct X1 {}; |
32 | struct X2 {}; |
33 | |
34 | template void f(X1&); |
35 | template void f<X2>(X2&); |
36 | |
37 | template struct X0<X1>; |
38 | |
39 | template struct X0<X2>::MemberClass; |
40 | |
41 | template void X0<X2>::mem_func(); |
42 | |
43 | template struct X0<X2>::MemberClassTemplate<X1>; |
44 | |
45 | template void X0<X2>::mem_func_template(X1&); |
46 | |
47 | template int X0<X2>::value; |
48 | } |
49 | |
50 | struct X3; |
51 | struct X4; |
52 | |
53 | template void has_inline_namespaces::f(X3&); |
54 | template void has_inline_namespaces::f<X4>(X4&); |
55 | |
56 | template struct has_inline_namespaces::X0<X3>; |
57 | |
58 | template struct has_inline_namespaces::X0<X4>::MemberClass; |
59 | |
60 | template void has_inline_namespaces::X0<X4>::mem_func(); |
61 | |
62 | template |
63 | struct has_inline_namespaces::X0<X4>::MemberClassTemplate<X3>; |
64 | |
65 | template |
66 | void has_inline_namespaces::X0<X4>::mem_func_template(X3&); |
67 | |