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