159812429SReid Kleckner // RUN: %clang_cc1 %s -triple=i686-pc-windows-msvc -debug-info-kind=limited -gcodeview -emit-llvm -o - | FileCheck %s 259812429SReid Kleckner 359812429SReid Kleckner // Tests virtual bases in the MS ABI. 459812429SReid Kleckner 559812429SReid Kleckner // CHECK: ![[NoPrimaryBase:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "NoPrimaryBase", 659812429SReid Kleckner // CHECK-SAME: elements: ![[elements:[0-9]+]] 759812429SReid Kleckner 859812429SReid Kleckner // CHECK: ![[elements]] = !{![[NoPrimaryBase_base:[0-9]+]]} 959812429SReid Kleckner 1059812429SReid Kleckner // CHECK: ![[NoPrimaryBase_base]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[NoPrimaryBase]], 11*3db2b108SBrock Wyma // CHECK-SAME: baseType: ![[HasVirtualMethod:[0-9]+]], offset: 4, flags: DIFlagVirtual, extraData: i32 0) 1259812429SReid Kleckner 1359812429SReid Kleckner // CHECK: ![[HasVirtualMethod]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "HasVirtualMethod" 1459812429SReid Kleckner 1559812429SReid Kleckner // CHECK: ![[HasPrimaryBase:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "HasPrimaryBase", 1659812429SReid Kleckner // CHECK-SAME: elements: ![[elements:[0-9]+]] 1759812429SReid Kleckner 1859812429SReid Kleckner // CHECK: ![[elements]] = !{![[SecondaryVTable_base:[0-9]+]], ![[HasVirtualMethod_base:[0-9]+]], ![[vshape:[0-9]+]]} 1959812429SReid Kleckner 2059812429SReid Kleckner // CHECK: ![[SecondaryVTable_base]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[HasPrimaryBase]], 21*3db2b108SBrock Wyma // CHECK-SAME: baseType: ![[SecondaryVTable:[0-9]+]], offset: 4, flags: DIFlagVirtual, extraData: i32 4) 2259812429SReid Kleckner 2359812429SReid Kleckner // CHECK: ![[SecondaryVTable]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "SecondaryVTable" 2459812429SReid Kleckner 25*3db2b108SBrock Wyma // CHECK: ![[HasVirtualMethod_base]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[HasPrimaryBase]], baseType: ![[HasVirtualMethod]], extraData: i32 0) 2659812429SReid Kleckner 27dff36738SBob Haarman // CHECK: ![[HasIndirectVirtualBase:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "HasIndirectVirtualBase" 28dff36738SBob Haarman // CHECK-SAME: elements: ![[elements:[0-9]+]] 29dff36738SBob Haarman 30dff36738SBob Haarman // CHECK: !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[HasIndirectVirtualBase]], baseType: ![[HasPrimaryBase]] 31dff36738SBob Haarman // CHECK-NOT: DIFlagIndirectVirtualBase 32dff36738SBob Haarman // CHECK-SAME: ) 33dff36738SBob Haarman 34dff36738SBob Haarman // CHECK: !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[HasIndirectVirtualBase]], baseType: ![[SecondaryVTable]] 35dff36738SBob Haarman // CHECK-SAME: flags: 36dff36738SBob Haarman // CHECK-SAME: DIFlagIndirectVirtualBase 37dff36738SBob Haarman 38eeb56abeSPeter Collingbourne // CHECK: ![[DynamicNoVFPtr:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "DynamicNoVFPtr", 39eeb56abeSPeter Collingbourne // CHECK-SAME: elements: ![[elements:[0-9]+]] 40eeb56abeSPeter Collingbourne 41eeb56abeSPeter Collingbourne // CHECK: ![[elements]] = !{![[POD_base:[0-9]+]]} 42eeb56abeSPeter Collingbourne 43eeb56abeSPeter Collingbourne // CHECK: ![[POD_base]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[DynamicNoVFPtr]], 44*3db2b108SBrock Wyma // CHECK-SAME: baseType: ![[POD:[0-9]+]], offset: 4, flags: DIFlagVirtual, extraData: i32 0) 45eeb56abeSPeter Collingbourne 46eeb56abeSPeter Collingbourne // CHECK: ![[POD]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "POD" 47eeb56abeSPeter Collingbourne 48eeb56abeSPeter Collingbourne struct POD { int pod; }; 49eeb56abeSPeter Collingbourne 50eeb56abeSPeter Collingbourne struct DynamicNoVFPtr : virtual POD { }; 51eeb56abeSPeter Collingbourne 52eeb56abeSPeter Collingbourne DynamicNoVFPtr dynamic_no_vfptr; 53eeb56abeSPeter Collingbourne 54eeb56abeSPeter Collingbourne struct HasVirtualMethod { virtual void f(); }; 55eeb56abeSPeter Collingbourne 56eeb56abeSPeter Collingbourne struct NoPrimaryBase : virtual HasVirtualMethod { }; 57eeb56abeSPeter Collingbourne 58eeb56abeSPeter Collingbourne NoPrimaryBase no_primary_base; 59eeb56abeSPeter Collingbourne 60eeb56abeSPeter Collingbourne struct SecondaryVTable { virtual void g(); }; 61eeb56abeSPeter Collingbourne 62eeb56abeSPeter Collingbourne struct HasPrimaryBase : virtual SecondaryVTable, HasVirtualMethod { }; 63eeb56abeSPeter Collingbourne 64eeb56abeSPeter Collingbourne HasPrimaryBase has_primary_base; 65eeb56abeSPeter Collingbourne 66dff36738SBob Haarman struct HasIndirectVirtualBase : public HasPrimaryBase {}; 67dff36738SBob Haarman 68dff36738SBob Haarman HasIndirectVirtualBase has_indirect_virtual_base; 69