blob: 245e8f9e10f82be065637085a44cc831c9830366 [file] [log] [blame]
Sebastian Redl58a2cd82011-04-24 16:28:06 +00001// no PCH
Sebastian Redleebafe52011-04-29 08:19:03 +00002// RUN: %clang_cc1 -emit-llvm-only -include %s -include %s %s
Sebastian Redl58a2cd82011-04-24 16:28:06 +00003// with PCH
Sebastian Redleebafe52011-04-29 08:19:03 +00004// RUN: %clang_cc1 -emit-llvm-only -chain-include %s -chain-include %s %s
Sebastian Redl58a2cd82011-04-24 16:28:06 +00005#if !defined(PASS1)
6#define PASS1
7
8// A base with a virtual dtor.
9struct A {
10 virtual ~A();
11};
12
13// A derived class with an implicit virtual dtor.
14struct 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.
24struct C : B {
25 C();
26 ~C() {}
27};
28
29#else
30
31void 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