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);
70 template<> extern float va
<float>;
71 extern template int va
<int>;
73 template<typename T
> T vb
= T(10);
74 template<> extern float vb
<float>;
76 template<typename T
> T vc
= T(10);
78 template<typename T
> T vd
= T(10);
79 template<typename T
> extern T
* vd
<T
*>;
85 // *** HEADER2: Second header file -- including HEADER1
86 #if defined(HEADER2) && !defined(HEADERUSE)
89 template<typename T
> extern T va
;
90 template<> constexpr float va
<float> = 2.5;
92 template<typename T
> T vb
= T(100);
94 namespace diff_types
{
96 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}}
97 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}}
99 template<typename T
> extern T def
;
103 namespace spec_join1
{
104 template<typename T
> extern T va
;
105 template<> float va
<float> = 1.5;
106 extern template int va
<int>;
108 template<> float vb
<float> = 1.5;
109 template int vb
<int>;
111 template<> float vc
<float> = 1.5;
112 template int vc
<int>;
114 template<typename T
> extern T vd
;
115 template<typename T
> T
* vd
<T
*> = new T();
120 // *** HEADERUSE: File using both header files -- including HEADER2
123 template int var0a
<int>;
124 float fvara
= var0a
<float>;
126 template<typename T
> extern T var0a
;
128 template<typename T
> T var0b
= T();
129 template int var0b
<int>;
130 float fvarb
= var0b
<float>;
133 template const int va
<const int>;
134 template<> const int va
<int> = 50;
135 static_assert(va
<float> == 2.5, "");
136 static_assert(va
<int> == 50, "");
138 template<> constexpr float vb
<float> = 2.5;
139 template const int vb
<const int>;
140 static_assert(vb
<float> == 2.5, "");
141 static_assert(vb
<const int> == 100, "");
143 namespace diff_types
{
144 template<typename T
> T def
= T();
150 static_assert(va
<float> == 1.5, "");
151 static_assert(va
<int> == 10, "");
153 template<typename T
> T
* vb
<T
*> = new T();
154 int* intpb
= vb
<int*>;
155 static_assert(vb
<float> == 1.5, "");
157 template<typename T
> T
* vc
<T
*> = new T();
158 template<> constexpr float vc
<float> = 1.5;
159 int* intpc
= vc
<int*>;
160 static_assert(vc
<float> == 1.5, "");
162 char* intpd
= vd
<char*>;
165 namespace spec_join1
{
166 template int va
<int>;
169 template<typename T
> extern T vb
;
172 int* intpb
= vd
<int*>;