Home | History | Annotate | Download | only in PCH
      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.
      9 struct A {
     10   virtual ~A();
     11 };
     12 
     13 // A derived class with an implicit virtual dtor.
     14 struct 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.
     24 struct C : B {
     25   C();
     26   ~C() {}
     27 };
     28 
     29 #else
     30 
     31 void 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