ms-x86-empty-nonvirtual-bases.cpp revision dc58180432868cfa9c060d5c41114634e4b841c7
1dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>&1 \ 2dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// RUN: | FileCheck %s 3dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 4dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntextern "C" int printf(const char *fmt, ...); 5dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 6dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct __declspec(align(8)) B0 { B0() {printf("B0 : %p\n", this);} }; 7dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct __declspec(align(8)) B1 { B1() {printf("B1 : %p\n", this);} }; 8dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct __declspec(align(8)) B2 { B2() {printf("B2 : %p\n", this);} }; 9dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct __declspec(align(8)) B3 { B3() {printf("B3 : %p\n", this);} }; 10dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct __declspec(align(8)) B4 { B4() {printf("B4 : %p\n", this);} }; 11dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 12dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct C0 { int a; C0() : a(0xf00000C0) {printf("C0 : %p\n", this);} }; 13dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct C1 { int a; C1() : a(0xf00000C1) {printf("C1 : %p\n", this);} }; 14dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct C2 { int a; C2() : a(0xf00000C2) {printf("C2 : %p\n", this);} }; 15dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct C3 { int a; C3() : a(0xf00000C3) {printf("C3 : %p\n", this);} }; 16dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct C4 { int a; C4() : a(0xf00000C4) {printf("C4 : %p\n", this);} }; 17dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 18dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct A : B0 { 19dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt int a; 20dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt A() : a(0xf000000A) {printf("X : %p\n", this);} 21dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt}; 22dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 23dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: *** Dumping AST Record Layout 24dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct A 25dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct B0 (base) (empty) 26dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | int a 27dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=8, align=8 28dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=8, nvalign=8] 29dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 30dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct B : B0 { 31dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt B0 b0; 32dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt int a; 33dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt B() : a(0xf000000B) {printf("X : %p\n", this);} 34dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt}; 35dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 36dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: *** Dumping AST Record Layout 37dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct B 38dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct B0 (base) (empty) 39dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct B0 b0 (empty) 40dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=8, align=8 41dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=0, nvalign=1] 42dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 8 | int a 43dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=16, align=8 44dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=16, nvalign=8] 45dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 46dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct C : B0, B1, B2, B3, B4 { 47dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt int a; 48dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt C() : a(0xf000000C) {printf("X : %p\n", this);} 49dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt}; 50dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 51dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: *** Dumping AST Record Layout 52dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct C 53dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct B0 (base) (empty) 54dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 8 | struct B1 (base) (empty) 55dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 16 | struct B2 (base) (empty) 56dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 24 | struct B3 (base) (empty) 57dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 32 | struct B4 (base) (empty) 58dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 32 | int a 59dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=40, align=8 60dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=40, nvalign=8] 61dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 62dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct D { 63dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt B0 b0; 64dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt C0 c0; 65dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt C1 c1; 66dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt C2 c2; 67dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt B1 b1; 68dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt int a; 69dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt D() : a(0xf000000D) {printf("X : %p\n", this);} 70dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt}; 71dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 72dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: *** Dumping AST Record Layout 73dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct D 74dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct B0 b0 (empty) 75dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=8, align=8 76dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=0, nvalign=1] 77dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 8 | struct C0 c0 78dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 8 | int a 79dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=4, align=4 80dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=4, nvalign=4] 81dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 12 | struct C1 c1 82dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 12 | int a 83dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=4, align=4 84dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=4, nvalign=4] 85dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 16 | struct C2 c2 86dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 16 | int a 87dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=4, align=4 88dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=4, nvalign=4] 89dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 24 | struct B1 b1 (empty) 90dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=8, align=8 91dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=0, nvalign=1] 92dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 32 | int a 93dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=40, align=8 94dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=40, nvalign=8] 95dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 96dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct E : B0, C0, C1, C2, B1 { 97dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt int a; 98dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt E() : a(0xf000000E) {printf("X : %p\n", this);} 99dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt}; 100dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 101dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: *** Dumping AST Record Layout 102dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct E 103dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct B0 (base) (empty) 104dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct C0 (base) 105dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | int a 106dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 4 | struct C1 (base) 107dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 4 | int a 108dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 8 | struct C2 (base) 109dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 8 | int a 110dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 16 | struct B1 (base) (empty) 111dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 16 | int a 112dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=24, align=8 113dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=24, nvalign=8] 114dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 115dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct F : C0, B0, B1, C1 { 116dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt int a; 117dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt F() : a(0xf000000F) {printf("X : %p\n", this);} 118dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt}; 119dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 120dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: *** Dumping AST Record Layout 121dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct F 122dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct C0 (base) 123dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | int a 124dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 8 | struct B0 (base) (empty) 125dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 16 | struct B1 (base) (empty) 126dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 16 | struct C1 (base) 127dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 16 | int a 128dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 20 | int a 129dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=24, align=8 130dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=24, nvalign=8] 131dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 132dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct G : B0, B1, B2, B3, B4 { 133dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt __declspec(align(32)) int a; 134dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt G() : a(0xf0000011) {printf("X : %p\n", this);} 135dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt}; 136dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 137dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: *** Dumping AST Record Layout 138dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct G 139dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct B0 (base) (empty) 140dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 8 | struct B1 (base) (empty) 141dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 16 | struct B2 (base) (empty) 142dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 24 | struct B3 (base) (empty) 143dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 32 | struct B4 (base) (empty) 144dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 32 | int a 145dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=64, align=32 146dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=64, nvalign=32] 147dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 148dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntstruct __declspec(align(32)) H : B0, B1, B2, B3, B4 { 149dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt int a; 150dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt H() : a(0xf0000011) {printf("X : %p\n", this);} 151dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt}; 152dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 153dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: *** Dumping AST Record Layout 154dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct H 155dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 0 | struct B0 (base) (empty) 156dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 8 | struct B1 (base) (empty) 157dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 16 | struct B2 (base) (empty) 158dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 24 | struct B3 (base) (empty) 159dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 32 | struct B4 (base) (empty) 160dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: 32 | int a 161dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | [sizeof=64, align=32 162dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt// CHECK: | nvsize=40, nvalign=8] 163dc58180432868cfa9c060d5c41114634e4b841c7Warren Hunt 164dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntint a[ 165dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntsizeof(A)+ 166dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntsizeof(B)+ 167dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntsizeof(C)+ 168dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntsizeof(D)+ 169dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntsizeof(E)+ 170dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntsizeof(F)+ 171dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntsizeof(G)+ 172dc58180432868cfa9c060d5c41114634e4b841c7Warren Huntsizeof(H)]; 173