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 Redl void 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