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. 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 40