1*67e74705SXin Li // RUN: %clang_cc1 %s -fno-rtti -triple=i386-pc-win32 -emit-llvm -o %t.ll -fdump-vtable-layouts >%t 2*67e74705SXin Li // RUN: FileCheck %s < %t 3*67e74705SXin Li // RUN: FileCheck --check-prefix=MANGLING %s < %t.ll 4*67e74705SXin Li 5*67e74705SXin Li struct A { 6*67e74705SXin Li virtual void f(); 7*67e74705SXin Li }; 8*67e74705SXin Li 9*67e74705SXin Li struct B { 10*67e74705SXin Li virtual void g() = 0; 11*67e74705SXin Li virtual void h(); 12*67e74705SXin Li }; 13*67e74705SXin Li 14*67e74705SXin Li struct C : A, B { 15*67e74705SXin Li // CHECK-LABEL: VFTable for 'A' in 'C' (1 entry) 16*67e74705SXin Li // CHECK-NEXT: 0 | void A::f() 17*67e74705SXin Li 18*67e74705SXin Li // CHECK-LABEL: VFTable for 'B' in 'C' (2 entries) 19*67e74705SXin Li // CHECK-NEXT: 0 | void C::g() 20*67e74705SXin Li // CHECK-NEXT: 1 | void B::h() 21*67e74705SXin Li 22*67e74705SXin Li // CHECK-LABEL: VFTable indices for 'C' (1 entry). 23*67e74705SXin Li // CHECK-NEXT: via vfptr at offset 4 24*67e74705SXin Li // CHECK-NEXT: 0 | void C::g() 25*67e74705SXin Li 26*67e74705SXin Li // MANGLING-DAG: @"\01??_7C@@6BA@@@" 27*67e74705SXin Li // MANGLING-DAG: @"\01??_7C@@6BB@@@" 28*67e74705SXin Li 29*67e74705SXin Li // Overrides only the right child's method (B::g), 30*67e74705SXin Li // needs this adjustment but not thunks. 31*67e74705SXin Li virtual void g(); 32*67e74705SXin Li }; 33*67e74705SXin Li 34*67e74705SXin Li C c; build_vftable(C * obj)35*67e74705SXin Livoid build_vftable(C *obj) { obj->g(); } 36