1439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo// No PCH:
2439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo// RUN: %clang_cc1 -pedantic -std=c++1y -include %s -include %s -verify %s -DNONPCH
3439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo// RUN: %clang_cc1 -pedantic -std=c++1y -include %s -include %s -verify %s -DNONPCH -DERROR
4439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo//
5439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo// With PCH:
6439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo// RUN: %clang_cc1 -pedantic -std=c++1y -emit-pch %s -o %t.a -DHEADER1
7439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo// RUN: %clang_cc1 -pedantic -std=c++1y -include-pch %t.a -emit-pch %s -o %t.b -DHEADER2
8439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo// RUN: %clang_cc1 -pedantic -std=c++1y -include-pch %t.b -verify %s -DHEADERUSE
9439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
10439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#ifndef ERROR
11439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo// expected-no-diagnostics
12439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#endif
13439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
14439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#ifdef NONPCH
15439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#if !defined(HEADER1)
16439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#define HEADER1
17439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#undef HEADER2
18439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#undef HEADERUSE
19439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#elif !defined(HEADER2)
20439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#define HEADER2
21439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#undef HEADERUSE
22439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#else
23439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#define HEADERUSE
24439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#undef HEADER1
25439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#undef HEADER2
26439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#endif
27439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#endif
28439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
29439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
30439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo// *** HEADER1: First header file
31439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#if defined(HEADER1) && !defined(HEADER2) && !defined(HEADERUSE)
32439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
33439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufotemplate<typename T> T var0a = T();
34439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufotemplate<typename T> extern T var0b;
35439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
36439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufonamespace join {
37439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> T va = T(100);
38439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> extern T vb;
39439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
40439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  namespace diff_types {
41439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#ifdef ERROR
42439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo    template<typename T> extern float err0;
43439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo    template<typename T> extern T err1;
44439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#endif
45439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo    template<typename T> extern T def;
46439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  }
47439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
48439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo}
49439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
50439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufonamespace spec {
51439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> constexpr T va = T(10);
52439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<> constexpr float va<float> = 1.5;
53439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template constexpr int va<int>;
54439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
55439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> T vb = T();
56439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<> constexpr float vb<float> = 1.5;
57439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
58439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> T vc = T();
59439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
60439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> constexpr T vd = T(10);
61ecbce69e354c77bf2d359111bad0c77c516e16f0Richard Smith  template<typename T> T* vd<T*> = new T();
62439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo}
63439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
64439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufonamespace spec_join1 {
65439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> T va = T(10);
66439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<> extern float va<float>;
67439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  extern template int va<int>;
68439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
69439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> T vb = T(10);
70439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<> extern float vb<float>;
71439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
72439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> T vc = T(10);
73439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
74439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> T vd = T(10);
75ecbce69e354c77bf2d359111bad0c77c516e16f0Richard Smith  template<typename T> extern T* vd<T*>;
76439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo}
77439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
78439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#endif
79439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
80439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
81439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo// *** HEADER2: Second header file -- including HEADER1
82439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#if defined(HEADER2) && !defined(HEADERUSE)
83439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
84439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufonamespace join {
85439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> extern T va;
86439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<> constexpr float va<float> = 2.5;
87439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
88439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> T vb = T(100);
89439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
90439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  namespace diff_types {
91439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#ifdef ERROR
92a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    template<typename T> extern T err0; // expected-error {{redeclaration of 'err0' with a different type: 'T' vs 'float'}}  // expected-note@42 {{previous declaration is here}}
93a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    template<typename T> extern float err1; // expected-error {{redeclaration of 'err1' with a different type: 'float' vs 'T'}} // expected-note@43 {{previous declaration is here}}
94439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#endif
95439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo    template<typename T> extern T def;
96439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  }
97439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo}
98439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
99439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufonamespace spec_join1 {
100439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> extern T va;
101439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<> float va<float> = 1.5;
102439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  extern template int va<int>;
103439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
104439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<> float vb<float> = 1.5;
105439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template int vb<int>;
106439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
107439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<> float vc<float> = 1.5;
108439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template int vc<int>;
109439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
110439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> extern T vd;
111ecbce69e354c77bf2d359111bad0c77c516e16f0Richard Smith  template<typename T> T* vd<T*> = new T();
112439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo}
113439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
114439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#endif
115439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
116439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo// *** HEADERUSE: File using both header files -- including HEADER2
117439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#ifdef HEADERUSE
118439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
119439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufotemplate int var0a<int>;
120439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufofloat fvara = var0a<float>;
121439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
122439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufotemplate<typename T> extern T var0a;
123439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
124439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufotemplate<typename T> T var0b = T();
125439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufotemplate int var0b<int>;
126439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufofloat fvarb = var0b<float>;
127439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
128439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufonamespace join {
129439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template const int va<const int>;
130439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<> const int va<int> = 50;
131439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  static_assert(va<float> == 2.5, "");
132439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  static_assert(va<int> == 50, "");
133439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
134439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<> constexpr float vb<float> = 2.5;
135439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template const int vb<const int>;
136439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  static_assert(vb<float> == 2.5, "");
137439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  static_assert(vb<const int> == 100, "");
138439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
139439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  namespace diff_types {
140439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo    template<typename T> T def = T();
141439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  }
142439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
143439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo}
144439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
145439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufonamespace spec {
146439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  static_assert(va<float> == 1.5, "");
147439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  static_assert(va<int> == 10, "");
148439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
149ecbce69e354c77bf2d359111bad0c77c516e16f0Richard Smith  template<typename T> T* vb<T*> = new T();
150ecbce69e354c77bf2d359111bad0c77c516e16f0Richard Smith  int* intpb = vb<int*>;
151439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  static_assert(vb<float> == 1.5, "");
152439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
153ecbce69e354c77bf2d359111bad0c77c516e16f0Richard Smith  template<typename T> T* vc<T*> = new T();
154439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<> constexpr float vc<float> = 1.5;
155ecbce69e354c77bf2d359111bad0c77c516e16f0Richard Smith  int* intpc = vc<int*>;
156439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  static_assert(vc<float> == 1.5, "");
157439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
158ecbce69e354c77bf2d359111bad0c77c516e16f0Richard Smith  char* intpd = vd<char*>;
159439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo}
160439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
161439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufonamespace spec_join1 {
162439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template int va<int>;
163439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  int a = va<int>;
164439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
165439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  template<typename T> extern T vb;
166439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  int b = vb<int>;
167439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
168ecbce69e354c77bf2d359111bad0c77c516e16f0Richard Smith  int* intpb = vd<int*>;
169439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo}
170439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
171439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#endif
172