16bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// RUN: %clang_cc1 %s -fno-rtti -triple=i386-pc-win32 -emit-llvm -o %t.ll -fdump-vtable-layouts >%t
26bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// RUN: FileCheck %s < %t
36bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// RUN: FileCheck --check-prefix=MANGLING %s < %t.ll
46bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
56bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct A {
66bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  virtual void f();
76bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
86bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
96bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct B {
106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  virtual void g() = 0;
116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  virtual void h();
126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct C : A, B {
156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK-LABEL: VFTable for 'A' in 'C' (1 entry)
166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK-NEXT:   0 | void A::f()
176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK-LABEL: VFTable for 'B' in 'C' (2 entries)
196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK-NEXT:   0 | void C::g()
206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK-NEXT:   1 | void B::h()
216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK-LABEL: VFTable indices for 'C' (1 entry).
236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK-NEXT:   via vfptr at offset 4
246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK-NEXT:   0 | void C::g()
256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // MANGLING-DAG: @"\01??_7C@@6BA@@@"
276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // MANGLING-DAG: @"\01??_7C@@6BB@@@"
286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Overrides only the right child's method (B::g),
306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // needs this adjustment but not thunks.
316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  virtual void g();
326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesC c;
356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid build_vftable(C *obj) { obj->g(); }
36