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