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