1 | // RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++11 -emit-pch -o %t.1 %s |
2 | // RUN: %clang_cc1 -triple x86_64-linux-gnu -error-on-deserialized-decl S1_keyfunc -error-on-deserialized-decl S3 -error-on-deserialized-decl DND -std=c++11 -include-pch %t.1 -emit-pch -o %t.2 %s |
3 | // RUN: %clang_cc1 -triple x86_64-linux-gnu -error-on-deserialized-decl S1_method -error-on-deserialized-decl S3 -error-on-deserialized-decl DND -std=c++11 -include-pch %t.2 -emit-llvm-only %s |
4 | |
5 | // FIXME: Why does this require an x86 target? |
6 | // REQUIRES: x86-registered-target |
7 | |
8 | #ifndef HEADER1 |
9 | #define HEADER1 |
10 | // Header. |
11 | |
12 | struct S1 { |
13 | void S1_method(); |
14 | virtual void S1_keyfunc(); |
15 | }; |
16 | |
17 | struct S3 {}; |
18 | |
19 | struct S2 { |
20 | operator S3(); |
21 | }; |
22 | |
23 | namespace vars { |
24 | constexpr int f() { return 0; } |
25 | struct X { constexpr X() {} }; |
26 | namespace v1 { const int DND = 0; } |
27 | namespace v2 { constexpr int DND = f(); } |
28 | namespace v3 { static X DND; } |
29 | namespace v4 { constexpr X DND = {}; } |
30 | } |
31 | |
32 | #elif !defined(HEADER2) |
33 | #define HEADER2 |
34 | |
35 | // Chained PCH. |
36 | S1 *s1; |
37 | S2 *s2; |
38 | |
39 | #else |
40 | |
41 | // Using the headers. |
42 | |
43 | void test(S1*, S2*) { |
44 | } |
45 | |
46 | #endif |
47 | |