1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>&1 \ 2 // RUN: | FileCheck %s 3 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \ 4 // RUN: | FileCheck %s -check-prefix CHECK-X64 5 6 extern "C" int printf(const char *fmt, ...); 7 8 struct B0 { int a; B0() : a(0xf00000B0) { printf("B0 = %p\n", this); } }; 9 struct B1 { int a; B1() : a(0xf00000B1) { printf("B1 = %p\n", this); } }; 10 struct B2 { B2() { printf("B2 = %p\n", this); } virtual void g() { printf("B2"); } }; 11 struct B3 : virtual B1 { B3() { printf("B3 = %p\n", this); } }; 12 struct B4 : virtual B1 { B4() { printf("B4 = %p\n", this); } virtual void g() { printf("B4"); } }; 13 14 struct A : B0, virtual B1 { 15 __declspec(align(16)) int a; 16 A() : a(0xf000000A) { printf(" A = %p\n\n", this); } 17 virtual void f() { printf("A"); } 18 }; 19 20 // CHECK: *** Dumping AST Record Layout 21 // CHECK: 0 | struct A 22 // CHECK: 0 | (A vftable pointer) 23 // CHECK: 16 | struct B0 (base) 24 // CHECK: 16 | int a 25 // CHECK: 20 | (A vbtable pointer) 26 // CHECK: 48 | int a 27 // CHECK: 64 | struct B1 (virtual base) 28 // CHECK: 64 | int a 29 // CHECK: | [sizeof=80, align=16 30 // CHECK: | nvsize=64, nvalign=16] 31 // CHECK-X64: *** Dumping AST Record Layout 32 // CHECK-X64: 0 | struct A 33 // CHECK-X64: 0 | (A vftable pointer) 34 // CHECK-X64: 8 | struct B0 (base) 35 // CHECK-X64: 8 | int a 36 // CHECK-X64: 16 | (A vbtable pointer) 37 // CHECK-X64: 32 | int a 38 // CHECK-X64: 48 | struct B1 (virtual base) 39 // CHECK-X64: 48 | int a 40 // CHECK-X64: | [sizeof=64, align=16 41 // CHECK-X64: | nvsize=48, nvalign=16] 42 43 struct B : B2, B0, virtual B1 { 44 __declspec(align(16)) int a; 45 B() : a(0xf000000B) { printf(" B = %p\n\n", this); } 46 virtual void f() { printf("B"); } 47 }; 48 49 // CHECK: *** Dumping AST Record Layout 50 // CHECK: 0 | struct B 51 // CHECK: 0 | struct B2 (primary base) 52 // CHECK: 0 | (B2 vftable pointer) 53 // CHECK: 4 | struct B0 (base) 54 // CHECK: 4 | int a 55 // CHECK: 8 | (B vbtable pointer) 56 // CHECK: 32 | int a 57 // CHECK: 48 | struct B1 (virtual base) 58 // CHECK: 48 | int a 59 // CHECK: | [sizeof=64, align=16 60 // CHECK: | nvsize=48, nvalign=16] 61 // CHECK-X64: *** Dumping AST Record Layout 62 // CHECK-X64: 0 | struct B 63 // CHECK-X64: 0 | struct B2 (primary base) 64 // CHECK-X64: 0 | (B2 vftable pointer) 65 // CHECK-X64: 8 | struct B0 (base) 66 // CHECK-X64: 8 | int a 67 // CHECK-X64: 16 | (B vbtable pointer) 68 // CHECK-X64: 32 | int a 69 // CHECK-X64: 48 | struct B1 (virtual base) 70 // CHECK-X64: 48 | int a 71 // CHECK-X64: | [sizeof=64, align=16 72 // CHECK-X64: | nvsize=48, nvalign=16] 73 74 struct C : B3, B0, virtual B1 { 75 __declspec(align(16)) int a; 76 C() : a(0xf000000C) { printf(" C = %p\n\n", this); } 77 virtual void f() { printf("C"); } 78 }; 79 80 // CHECK: *** Dumping AST Record Layout 81 // CHECK: 0 | struct C 82 // CHECK: 0 | (C vftable pointer) 83 // CHECK: 16 | struct B3 (base) 84 // CHECK: 16 | (B3 vbtable pointer) 85 // CHECK: 20 | struct B0 (base) 86 // CHECK: 20 | int a 87 // CHECK: 32 | int a 88 // CHECK: 48 | struct B1 (virtual base) 89 // CHECK: 48 | int a 90 // CHECK: | [sizeof=64, align=16 91 // CHECK: | nvsize=48, nvalign=16] 92 // CHECK-X64: *** Dumping AST Record Layout 93 // CHECK-X64: 0 | struct C 94 // CHECK-X64: 0 | (C vftable pointer) 95 // CHECK-X64: 8 | struct B3 (base) 96 // CHECK-X64: 8 | (B3 vbtable pointer) 97 // CHECK-X64: 16 | struct B0 (base) 98 // CHECK-X64: 16 | int a 99 // CHECK-X64: 32 | int a 100 // CHECK-X64: 48 | struct B1 (virtual base) 101 // CHECK-X64: 48 | int a 102 // CHECK-X64: | [sizeof=64, align=16 103 // CHECK-X64: | nvsize=48, nvalign=16] 104 105 struct D : B4, B0, virtual B1 { 106 __declspec(align(16)) int a; 107 D() : a(0xf000000D) { printf(" D = %p\n\n", this); } 108 virtual void f() { printf("D"); } 109 }; 110 111 // CHECK: *** Dumping AST Record Layout 112 // CHECK: 0 | struct D 113 // CHECK: 0 | struct B4 (primary base) 114 // CHECK: 0 | (B4 vftable pointer) 115 // CHECK: 4 | (B4 vbtable pointer) 116 // CHECK: 8 | struct B0 (base) 117 // CHECK: 8 | int a 118 // CHECK: 16 | int a 119 // CHECK: 32 | struct B1 (virtual base) 120 // CHECK: 32 | int a 121 // CHECK: | [sizeof=48, align=16 122 // CHECK: | nvsize=32, nvalign=16] 123 // CHECK-X64: *** Dumping AST Record Layout 124 // CHECK-X64: 0 | struct D 125 // CHECK-X64: 0 | struct B4 (primary base) 126 // CHECK-X64: 0 | (B4 vftable pointer) 127 // CHECK-X64: 8 | (B4 vbtable pointer) 128 // CHECK-X64: 16 | struct B0 (base) 129 // CHECK-X64: 16 | int a 130 // CHECK-X64: 32 | int a 131 // CHECK-X64: 48 | struct B1 (virtual base) 132 // CHECK-X64: 48 | int a 133 // CHECK-X64: | [sizeof=64, align=16 134 // CHECK-X64: | nvsize=48, nvalign=16] 135 136 int a[ 137 sizeof(A)+ 138 sizeof(B)+ 139 sizeof(C)+ 140 sizeof(D)]; 141