1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s -Wno-c++1y-extensions
2a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
3a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// This test creates cases where implicit instantiations of various entities
4a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// would cause a diagnostic, but provides expliict specializations for those
5a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// entities that avoid the diagnostic. The specializations are alternately
6a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// declarations and definitions, and the intent of this test is to verify
7a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// that we allow specializations only in the appropriate namespaces (and
8a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// nowhere else).
9a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct NonDefaultConstructible {
10a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  NonDefaultConstructible(int);
11a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor};
12a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// FIXME: The "must originally be declared in namespace" diagnostics throughout
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// this file are wrong.
15a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
16a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor// C++ [temp.expl.spec]p1:
17a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor//   An explicit specialization of any of the following:
18a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
19a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor//     -- function template
20a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 {
21a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<typename T> void f0(T) {
22a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor    T t;
23a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  }
24a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
25a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> void f0(NonDefaultConstructible) { }
26a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
27a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  void test_f0(NonDefaultConstructible NDC) {
28a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor    f0(NDC);
29a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  }
30a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
31a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> void f0(int);
32a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> void f0(long);
33a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
34a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
35a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> void N0::f0(int) { } // okay
36a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
37a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N1 {
38a1c4f7c833093f87d5187c4449a3d4534cfa40a4Richard Smith  template<> void N0::f0(long) { } // expected-error{{does not enclose namespace}}
39a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
40a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
41a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> void N0::f0(double) { }
42a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
43a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct X1 {
44a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<typename T> void f(T);
45a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
46a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> void f(int); // expected-error{{in class scope}}
47a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor};
48a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
49a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor//     -- class template
50a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 {
51a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
52a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<typename T>
53a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct X0 { // expected-note {{here}}
54a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  static T member;
55a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
56a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  void f1(T t) {
57a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor    t = 17;
58a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  }
59a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
60a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct Inner : public T { }; // expected-note 2{{here}}
61a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
62a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<typename U>
63a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct InnerTemplate : public T { }; // expected-note 1{{explicitly specialized}} \
64a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor   // expected-error{{base specifier}}
65a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
66a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<typename U>
67a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  void ft1(T t, U u);
68a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor};
69a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
70a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
71a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
72a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<typename T>
73a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<typename U>
74a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorvoid N0::X0<T>::ft1(T t, U u) {
75a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  t = u;
76a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
77a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
78a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<typename T> T N0::X0<T>::member;
79a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
80a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> struct N0::X0<void> { };
81a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<void> test_X0;
82a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
83a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N1 {
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<> struct N0::X0<const void> { }; // expected-error{{class template specialization of 'X0' not in a namespace enclosing 'N0'}}
85a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
86a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
87a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 {
88a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> struct X0<volatile void>;
89a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
90a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
91a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> struct N0::X0<volatile void> {
92a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  void f1(void *);
93a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor};
94a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//     -- variable template [C++1y]
96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace N0 {
97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<typename T> int v0; // expected-note +{{here}}
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v0<char[1]>;
99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v0<char[2]>;
100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v0<char[5]>;
101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v0<char[6]>;
102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesusing N0::v0;
104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<typename T> int v1; // expected-note +{{here}}
106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v1<char[3]>;
107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v1<char[4]>;
108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v1<char[7]>;
109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> extern int v1<char[8]>;
110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int N0::v0<int[1]>;
112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v0<int[2]>; // FIXME: ill-formed
113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int ::v1<int[3]>; // expected-warning {{extra qualification}}
114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v1<int[4]>;
115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int N0::v0<char[1]>;
117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v0<char[2]>; // FIXME: ill-formed
118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int ::v1<char[3]>; // expected-warning {{extra qualification}}
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v1<char[4]>;
120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace N1 {
122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int N0::v0<int[5]>; // expected-error {{must originally be declared in namespace 'N0'}} expected-error {{does not enclose namespace}}
123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v0<int[6]>; // expected-error {{must originally be declared in namespace 'N0'}}
124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int ::v1<int[7]>; // expected-error {{must originally be declared in the global scope}} expected-error {{cannot name the global scope}}
125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v1<int[8]>; // expected-error {{must originally be declared in the global scope}}
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int N0::v0<char[5]>; // expected-error {{does not enclose namespace 'N0'}}
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v0<char[6]>; // FIXME: ill-formed
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int ::v1<char[7]>; // expected-error {{cannot name the global scope}}
130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> int v1<char[8]>; // FIXME: ill-formed
131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
133a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor//     -- member function of a class template
134a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> void N0::X0<void*>::f1(void *) { }
135a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
136a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorvoid test_spec(N0::X0<void*> xvp, void *vp) {
137a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  xvp.f1(vp);
138a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
139a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
140a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 {
141a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> void X0<volatile void>::f1(void *) { } // expected-error{{no function template matches}}
142a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
143a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> void X0<const volatile void*>::f1(const volatile void*);
144a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
145a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
146a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorvoid test_x0_cvvoid(N0::X0<const volatile void*> x0, const volatile void *cvp) {
147a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  x0.f1(cvp); // okay: we've explicitly specialized
148a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
149a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
150a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor//     -- static data member of a class template
151a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 {
152a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  // This actually tests p15; the following is a declaration, not a definition.
153a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<>
154a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  NonDefaultConstructible X0<NonDefaultConstructible>::member;
155a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
156a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> long X0<long>::member = 17;
157a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
158a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> float X0<float>::member;
159a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
160a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> double X0<double>::member;
161a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
162a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
163a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorNonDefaultConstructible &get_static_member() {
164a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  return N0::X0<NonDefaultConstructible>::member;
165a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
166a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
167a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> int N0::X0<int>::member;
168a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
169a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> float N0::X0<float>::member = 3.14f;
170a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
171a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N1 {
172a1c4f7c833093f87d5187c4449a3d4534cfa40a4Richard Smith  template<> double N0::X0<double>::member = 3.14; // expected-error{{does not enclose namespace}}
173a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
174a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
175a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor//    -- member class of a class template
176a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 {
177a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
178a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<>
179a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct X0<void*>::Inner { };
180a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
181a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<>
182a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct X0<int>::Inner { };
183a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
184a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<>
185a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct X0<unsigned>::Inner;
186a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
187a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<>
188a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct X0<float>::Inner;
189a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
190a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<>
191a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct X0<double>::Inner; // expected-note{{forward declaration}}
192a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
193a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
194a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<>
195a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct N0::X0<long>::Inner { };
196a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
197a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<>
198a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct N0::X0<float>::Inner { };
199a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
200a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N1 {
201a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<>
202a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct N0::X0<unsigned>::Inner { }; // expected-error{{member class specialization}}
203a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
204a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<>
205a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct N0::X0<unsigned long>::Inner { }; // expected-error{{member class specialization}}
206a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor};
207a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
208a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<void*>::Inner inner0;
209a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<int>::Inner inner1;
210a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<long>::Inner inner2;
211a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<float>::Inner inner3;
212a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<double>::Inner inner4; // expected-error{{incomplete}}
213a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
214a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor//    -- member class template of a class template
215a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 {
216a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<>
217a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<>
218a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct X0<void*>::InnerTemplate<int> { };
219a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
220a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> template<>
221a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct X0<int>::InnerTemplate<int>; // expected-note{{forward declaration}}
222a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
223a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> template<>
224a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct X0<int>::InnerTemplate<long>;
225a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
226a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> template<>
227a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct X0<int>::InnerTemplate<double>;
228a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
229a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
230a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> template<>
231a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct N0::X0<int>::InnerTemplate<long> { }; // okay
232a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
233a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> template<>
234a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorstruct N0::X0<int>::InnerTemplate<float> { };
235a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
236a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N1 {
237a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> template<>
238a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  struct N0::X0<int>::InnerTemplate<double> { }; // expected-error{{enclosing}}
239a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
240a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
241a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<void*>::InnerTemplate<int> inner_template0;
242a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<int>::InnerTemplate<int> inner_template1; // expected-error{{incomplete}}
243a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<int>::InnerTemplate<long> inner_template2;
244a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas GregorN0::X0<int>::InnerTemplate<unsigned long> inner_template3; // expected-note{{instantiation}}
245a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
246a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor//    -- member function template of a class template
247a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N0 {
248a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<>
249a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<>
250a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  void X0<void*>::ft1(void*, const void*) { }
251a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
252a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> template<>
253a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  void X0<void*>::ft1(void *, int);
254a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
255a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> template<>
256a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  void X0<void*>::ft1(void *, unsigned);
257a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
258a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> template<>
259a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  void X0<void*>::ft1(void *, long);
260a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
261a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
262a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> template<>
263a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorvoid N0::X0<void*>::ft1(void *, unsigned) { } // okay
264a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
265a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregortemplate<> template<>
266a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorvoid N0::X0<void*>::ft1(void *, float) { }
267a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
268a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregornamespace N1 {
269a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  template<> template<>
270a1c4f7c833093f87d5187c4449a3d4534cfa40a4Richard Smith  void N0::X0<void*>::ft1(void *, long) { } // expected-error{{does not enclose namespace}}
271a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
272a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
273a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor
274a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregorvoid test_func_template(N0::X0<void *> xvp, void *vp, const void *cvp,
275a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor                        int i, unsigned u) {
276a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  xvp.ft1(vp, cvp);
277a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  xvp.ft1(vp, i);
278a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor  xvp.ft1(vp, u);
279a4d5de539bc2f0cd25d6292e84eaa067591ff792Douglas Gregor}
280cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
281cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregornamespace has_inline_namespaces {
282cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  inline namespace inner {
283cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor    template<class T> void f(T&);
284cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
285cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor    template<class T>
286cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor    struct X0 {
287cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor      struct MemberClass;
288cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
289cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor      void mem_func();
290cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
291cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor      template<typename U>
292cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor      struct MemberClassTemplate;
293cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
294cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor      template<typename U>
295cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor      void mem_func_template(U&);
296cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
297cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor      static int value;
298cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor    };
299cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  }
300cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
301cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  struct X1;
302cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  struct X2;
303cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
304cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  // An explicit specialization whose declarator-id is not qualified
305cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  // shall be declared in the nearest enclosing namespace of the
306cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  // template, or, if the namespace is inline (7.3.1), any namespace
307cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  // from its enclosing namespace set.
308cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  template<> void f(X1&);
309cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  template<> void f<X2>(X2&);
310cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
311cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  template<> struct X0<X1> { };
312cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
313cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  template<> struct X0<X2>::MemberClass { };
314cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
315cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  template<> void X0<X2>::mem_func();
316cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
317cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  template<> template<typename T> struct X0<X2>::MemberClassTemplate { };
318cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
319cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  template<> template<typename T> void X0<X2>::mem_func_template(T&) { }
320cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
321cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  template<> int X0<X2>::value = 12;
322cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor}
323cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
324cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregorstruct X3;
325cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregorstruct X4;
326cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
327cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> void has_inline_namespaces::f(X3&);
328cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> void has_inline_namespaces::f<X4>(X4&);
329cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
330cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> struct has_inline_namespaces::X0<X3> { };
331cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
332cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> struct has_inline_namespaces::X0<X4>::MemberClass { };
333cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
334cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> void has_inline_namespaces::X0<X4>::mem_func();
335cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
336cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> template<typename T>
337cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregorstruct has_inline_namespaces::X0<X4>::MemberClassTemplate { };
338cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
339cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> template<typename T>
340cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregorvoid has_inline_namespaces::X0<X4>::mem_func_template(T&) { }
341cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor
342cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregortemplate<> int has_inline_namespaces::X0<X4>::value = 13;
343459455b9868974e2bb98032f768fe111ff376adaDavid Blaikie
344459455b9868974e2bb98032f768fe111ff376adaDavid Blaikienamespace PR12938 {
345459455b9868974e2bb98032f768fe111ff376adaDavid Blaikie  template<typename> [[noreturn]] void func();
346459455b9868974e2bb98032f768fe111ff376adaDavid Blaikie  template<> void func<int>();
347459455b9868974e2bb98032f768fe111ff376adaDavid Blaikie}
348