2 // RUN: %clang_cc1 -pedantic -std=c++1y -include %s -include %s -verify %s -DNONPCH
3 // RUN: %clang_cc1 -pedantic -std=c++1y -include %s -include %s -verify %s -DNONPCH -DERROR
6 // RUN: %clang_cc1 -pedantic -std=c++1y -emit-pch %s -o %t.a -DHEADER1
7 // RUN: %clang_cc1 -pedantic -std=c++1y -include-pch %t.a -emit-pch %s -o %t.b -DHEADER2
8 // RUN: %clang_cc1 -pedantic -std=c++1y -include-pch %t.b -verify %s -DHEADERUSE
10 // RUN: %clang_cc1 -pedantic -std=c++1y -emit-pch -fpch-instantiate-templates %s -o %t.a -DHEADER1
11 // RUN: %clang_cc1 -pedantic -std=c++1y -include-pch %t.a -emit-pch -fpch-instantiate-templates %s -o %t.b -DHEADER2
12 // RUN: %clang_cc1 -pedantic -std=c++1y -include-pch %t.b -verify %s -DHEADERUSE
15 // expected-no-diagnostics
23 #elif !defined(HEADER2)
34 // *** HEADER1: First header file
35 #if defined(HEADER1) && !defined(HEADER2) && !defined(HEADERUSE)
37 template<typename T
> T var0a
= T();
38 template<typename T
> extern T var0b
;
41 template<typename T
> T va
= T(100);
42 template<typename T
> extern T vb
;
44 namespace diff_types
{
46 template<typename T
> extern float err0
;
47 template<typename T
> extern T err1
;
49 template<typename T
> extern T def
;
55 template<typename T
> constexpr T va
= T(10);
56 template<> constexpr float va
<float> = 1.5;
57 template constexpr int va
<int>;
59 template<typename T
> T vb
= T();
60 template<> constexpr float vb
<float> = 1.5;
62 template<typename T
> T vc
= T();
64 template<typename T
> constexpr T vd
= T(10);
65 template<typename T
> T
* vd
<T
*> = new T();
68 namespace spec_join1
{
69 template<typename T
> T va
= T(10);
71 template<> float va
<float>; // expected-note {{previous definition is here}}
73 extern template int va
<int>;
75 template<typename T
> T vb
= T(10);
77 template<> float vb
<float>; // expected-note {{previous definition is here}}
80 template<typename T
> T vc
= T(10);
82 template<typename T
> T vd
= T(10);
83 template<typename T
> extern T
* vd
<T
*>;
89 // *** HEADER2: Second header file -- including HEADER1
90 #if defined(HEADER2) && !defined(HEADERUSE)
93 template<typename T
> extern T va
;
94 template<> constexpr float va
<float> = 2.5;
96 template<typename T
> T vb
= T(100);
98 namespace diff_types
{
100 template<typename T
> extern T err0
; // expected-error {{redeclaration of 'err0' with a different type: 'T' vs 'float'}} // expected-note@46 {{previous declaration is here}}
101 template<typename T
> extern float err1
; // expected-error {{redeclaration of 'err1' with a different type: 'float' vs 'T'}} // expected-note@47 {{previous declaration is here}}
103 template<typename T
> extern T def
;
107 namespace spec_join1
{
108 template<typename T
> extern T va
;
110 template<> float va
<float> = 1.5; // expected-error {{redefinition of 'va<float>'}}
112 extern template int va
<int>;
115 template<> float vb
<float> = 1.5; // expected-error {{redefinition of 'vb<float>'}}
117 template int vb
<int>;
119 template<> float vc
<float> = 1.5;
120 template int vc
<int>;
122 template<typename T
> extern T vd
;
123 template<typename T
> T
* vd
<T
*> = new T();
128 // *** HEADERUSE: File using both header files -- including HEADER2
131 template int var0a
<int>;
132 float fvara
= var0a
<float>;
134 template<typename T
> extern T var0a
;
136 template<typename T
> T var0b
= T();
137 template int var0b
<int>;
138 float fvarb
= var0b
<float>;
141 template const int va
<const int>;
142 template<> const int va
<int> = 50;
143 static_assert(va
<float> == 2.5, "");
144 static_assert(va
<int> == 50, "");
146 template<> constexpr float vb
<float> = 2.5;
147 template const int vb
<const int>;
148 static_assert(vb
<float> == 2.5, "");
149 static_assert(vb
<const int> == 100, "");
151 namespace diff_types
{
152 template<typename T
> T def
= T();
158 static_assert(va
<float> == 1.5, "");
159 static_assert(va
<int> == 10, "");
161 template<typename T
> T
* vb
<T
*> = new T();
162 int* intpb
= vb
<int*>;
163 static_assert(vb
<float> == 1.5, "");
165 template<typename T
> T
* vc
<T
*> = new T();
166 template<> constexpr float vc
<float> = 1.5;
167 int* intpc
= vc
<int*>;
168 static_assert(vc
<float> == 1.5, "");
170 char* intpd
= vd
<char*>;
173 namespace spec_join1
{
174 template int va
<int>;
177 template<typename T
> extern T vb
;
180 int* intpb
= vd
<int*>;