diff options
Diffstat (limited to 'test/PCH/chain-cxx.cpp')
-rw-r--r-- | test/PCH/chain-cxx.cpp | 80 |
1 files changed, 77 insertions, 3 deletions
diff --git a/test/PCH/chain-cxx.cpp b/test/PCH/chain-cxx.cpp index 3e46214..d269de5 100644 --- a/test/PCH/chain-cxx.cpp +++ b/test/PCH/chain-cxx.cpp @@ -1,13 +1,82 @@ // Test C++ chained PCH functionality // Without PCH -// RUN: %clang_cc1 -fsyntax-only -verify -include %S/Inputs/chain-cxx1.h -include %S/Inputs/chain-cxx2.h %s +// RUN: %clang_cc1 -fsyntax-only -verify -include %s -include %s %s // With PCH -// RUN: %clang_cc1 -x c++ -emit-pch -o %t1 %S/Inputs/chain-cxx1.h -// RUN: %clang_cc1 -x c++ -emit-pch -o %t2 %S/Inputs/chain-cxx2.h -include-pch %t1 -chained-pch +// RUN: %clang_cc1 -x c++-header -emit-pch -o %t1 %s +// RUN: %clang_cc1 -x c++-header -emit-pch -o %t2 %s -include-pch %t1 -chained-pch // RUN: %clang_cc1 -fsyntax-only -verify -include-pch %t2 %s +#ifndef HEADER1 +#define HEADER1 +//===----------------------------------------------------------------------===// +// Primary header for C++ chained PCH test + +void f(); + +// Name not appearing in dependent +void pf(); + +namespace ns { + void g(); + + void pg(); +} + +template <typename T> +struct S { typedef int G; }; + +// Partially specialize +template <typename T> +struct S<T *> { typedef int H; }; + +template <typename T> struct TS2; +typedef TS2<int> TS2int; + +//===----------------------------------------------------------------------===// +#elif not defined(HEADER2) +#define HEADER2 +//===----------------------------------------------------------------------===// +// Dependent header for C++ chained PCH test + +// Overload function from primary +void f(int); + +// Add function with different name +void f2(); + +// Reopen namespace +namespace ns { + // Overload function from primary + void g(int); + + // Add different name + void g2(); +} + +// Specialize template from primary +template <> +struct S<int> { typedef int I; }; + +// Partially specialize +template <typename T> +struct S<T &> { typedef int J; }; + +// Specialize previous partial specialization +template <> +struct S<int *> { typedef int K; }; + +// Specialize the partial specialization from this file +template <> +struct S<int &> { typedef int L; }; + +template <typename T> struct TS2 { }; + +//===----------------------------------------------------------------------===// +#else +//===----------------------------------------------------------------------===// + void test() { f(); f(1); @@ -25,4 +94,9 @@ void test() { typedef S<double &>::J T4; typedef S<int *>::K T5; typedef S<int &>::L T6; + + TS2int ts2; } + +//===----------------------------------------------------------------------===// +#endif |