1 // Test C++ chained PCH functionality 2 3 // Without PCH 4 // RUN: %clang_cc1 -fsyntax-only -verify -include %s -include %s %s 5 6 // With PCH 7 // RUN: %clang_cc1 -fsyntax-only -verify %s -chain-include %s -chain-include %s 8 9 // With modules 10 // RUN: %clang_cc1 -fsyntax-only -verify -fmodules %s -chain-include %s -chain-include %s 11 12 // expected-no-diagnostics 13 14 #ifndef HEADER1 15 #define HEADER1 16 //===----------------------------------------------------------------------===// 17 // Primary header for C++ chained PCH test 18 19 void f(); 20 21 // Name not appearing in dependent 22 void pf(); 23 24 namespace ns { 25 void g(); 26 27 void pg(); 28 } 29 30 template <typename T> 31 struct S { typedef int G; }; 32 33 // Partially specialize 34 template <typename T> 35 struct S<T *> { typedef int H; }; 36 37 template <typename T> struct TS2; 38 typedef TS2<int> TS2int; 39 40 template <typename T> struct TestBaseSpecifiers { }; 41 template<typename T> struct TestBaseSpecifiers2 : TestBaseSpecifiers<T> { }; 42 43 template <typename T> 44 struct TS3 { 45 static const int value = 0; 46 static const int value2; 47 }; 48 template <typename T> 49 const int TS3<T>::value; 50 template <typename T> 51 const int TS3<T>::value2 = 1; 52 // Instantiate struct, but not value. 53 struct instantiate : TS3<int> {}; 54 55 // Typedef 56 typedef int Integer; 57 58 //===----------------------------------------------------------------------===// 59 #elif not defined(HEADER2) 60 #define HEADER2 61 #if !defined(HEADER1) 62 #error Header inclusion order messed up 63 #endif 64 65 //===----------------------------------------------------------------------===// 66 // Dependent header for C++ chained PCH test 67 68 // Overload function from primary 69 void f(int); 70 71 // Add function with different name 72 void f2(); 73 74 // Reopen namespace 75 namespace ns { 76 // Overload function from primary 77 void g(int); 78 79 // Add different name 80 void g2(); 81 } 82 83 // Specialize template from primary 84 template <> 85 struct S<int> { typedef int I; }; 86 87 // Partially specialize 88 template <typename T> 89 struct S<T &> { typedef int J; }; 90 91 // Specialize previous partial specialization 92 template <> 93 struct S<int *> { typedef int K; }; 94 95 // Specialize the partial specialization from this file 96 template <> 97 struct S<int &> { typedef int L; }; 98 99 template <typename T> struct TS2 { }; 100 101 struct TestBaseSpecifiers3 { }; 102 struct TestBaseSpecifiers4 : TestBaseSpecifiers3 { }; 103 104 struct A { }; 105 struct B : A { }; 106 107 // Instantiate TS3's members. 108 static const int ts3m1 = TS3<int>::value; 109 extern int arr[TS3<int>::value2]; 110 111 // Redefinition of typedef 112 typedef int Integer; 113 114 //===----------------------------------------------------------------------===// 115 #else 116 //===----------------------------------------------------------------------===// 117 118 void test() { 119 f(); 120 f(1); 121 pf(); 122 f2(); 123 124 ns::g(); 125 ns::g(1); 126 ns::pg(); 127 ns::g2(); 128 129 typedef S<double>::G T1; 130 typedef S<double *>::H T2; 131 typedef S<int>::I T3; 132 typedef S<double &>::J T4; 133 typedef S<int *>::K T5; 134 typedef S<int &>::L T6; 135 136 TS2int ts2; 137 138 B b; 139 Integer i = 17; 140 } 141 142 // Should have remembered that there is a definition. 143 static const int ts3m2 = TS3<int>::value; 144 int arr[TS3<int>::value2]; 145 146 //===----------------------------------------------------------------------===// 147 #endif 148