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