1 | // no PCH |
2 | // RUN: %clang_cc1 -emit-llvm-only -include %s -include %s %s |
3 | // with PCH |
4 | // RUN: %clang_cc1 -emit-llvm-only -chain-include %s -chain-include %s %s |
5 | #if !defined(PASS1) |
6 | #define PASS1 |
7 | |
8 | // A base with a virtual dtor. |
9 | struct A { |
10 | virtual ~A(); |
11 | }; |
12 | |
13 | // A derived class with an implicit virtual dtor. |
14 | struct B : A { |
15 | // Key function to suppress vtable definition. |
16 | virtual void virt(); |
17 | }; |
18 | |
19 | #elif !defined(PASS2) |
20 | #define PASS2 |
21 | |
22 | // Further derived class that requires ~B(). |
23 | // Causes definition of ~B(), but it was lost when saving PCH. |
24 | struct C : B { |
25 | C(); |
26 | ~C() {} |
27 | }; |
28 | |
29 | #else |
30 | |
31 | void foo() { |
32 | // Variable that requires ~C(). |
33 | C c; |
34 | } |
35 | |
36 | // VTable placement would again cause definition of ~B(), hiding the bug, |
37 | // if not for B::virt(), which suppresses the placement. |
38 | |
39 | #endif |
40 | |