| // 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 |