// no PCH // RUN: %clang_cc1 -emit-llvm-only -include %s -include %s %s // with PCH // RUN: %clang_cc1 -emit-llvm-only -chain-include %s -chain-include %s %s #if !defined(PASS1) #define PASS1 // A base with a virtual dtor. struct A { virtual ~A(); }; // A derived class with an implicit virtual dtor. struct B : A { // Key function to suppress vtable definition. virtual void virt(); }; #elif !defined(PASS2) #define PASS2 // Further derived class that requires ~B(). // Causes definition of ~B(), but it was lost when saving PCH. struct C : B { C(); ~C() {} }; #else void foo() { // Variable that requires ~C(). C c; } // VTable placement would again cause definition of ~B(), hiding the bug, // if not for B::virt(), which suppresses the placement. #endif