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