10a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>&1 \ 27f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj// RUN: | FileCheck %s 37f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \ 47f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj// RUN: | FileCheck %s -check-prefix CHECK-X64 57f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj 60a87e8d2d445c36fbd78787c3a553ea46bfe50desewardjextern "C" int printf(const char *fmt, ...); 70a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj 80a87e8d2d445c36fbd78787c3a553ea46bfe50desewardjstruct B0 { int a; B0() : a(0xf00000B0) { printf("B0 = %p\n", this); } }; 90a87e8d2d445c36fbd78787c3a553ea46bfe50desewardjstruct B1 { int a; B1() : a(0xf00000B1) { printf("B1 = %p\n", this); } }; 100a87e8d2d445c36fbd78787c3a553ea46bfe50desewardjstruct B2 { B2() { printf("B2 = %p\n", this); } virtual void g() { printf("B2"); } }; 110a87e8d2d445c36fbd78787c3a553ea46bfe50desewardjstruct B3 : virtual B1 { B3() { printf("B3 = %p\n", this); } }; 120a87e8d2d445c36fbd78787c3a553ea46bfe50desewardjstruct B4 : virtual B1 { B4() { printf("B4 = %p\n", this); } virtual void g() { printf("B4"); } }; 1315df336557eb012a5f3b2f1482a0411857039496sewardj 140a87e8d2d445c36fbd78787c3a553ea46bfe50desewardjstruct A : B0, virtual B1 { 155ac99069b0538adcb2f18b04b078ea27b00b4185sewardj __declspec(align(16)) int a; 165ac99069b0538adcb2f18b04b078ea27b00b4185sewardj A() : a(0xf000000A) { printf(" A = %p\n\n", this); } 175ac99069b0538adcb2f18b04b078ea27b00b4185sewardj virtual void f() { printf("A"); } 180a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj}; 197f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj 207f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj// CHECK: *** Dumping AST Record Layout 217f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj// CHECK: *** Dumping AST Record Layout 227f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj// CHECK: *** Dumping AST Record Layout 237f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj// CHECK-NEXT: 0 | struct A 247f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj// CHECK-NEXT: 0 | (A vftable pointer) 257f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj// CHECK-NEXT: 16 | struct B0 (base) 267f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj// CHECK-NEXT: 16 | int a 270a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 20 | (A vbtable pointer) 280a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 48 | int a 290a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 64 | struct B1 (virtual base) 300a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 64 | int a 310a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: | [sizeof=80, align=16 320a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: | nvsize=64, nvalign=16] 330a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64: *** Dumping AST Record Layout 340a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64: *** Dumping AST Record Layout 350a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64: *** Dumping AST Record Layout 360a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 0 | struct A 370a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 0 | (A vftable pointer) 380a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 16 | struct B0 (base) 390a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 16 | int a 400a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 24 | (A vbtable pointer) 410a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 48 | int a 420a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 64 | struct B1 (virtual base) 430a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 64 | int a 440a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: | [sizeof=80, align=16 450a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: | nvsize=64, nvalign=16] 460a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj 470a87e8d2d445c36fbd78787c3a553ea46bfe50desewardjstruct B : B2, B0, virtual B1 { 480a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj __declspec(align(16)) int a; 490a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj B() : a(0xf000000B) { printf(" B = %p\n\n", this); } 500a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj virtual void f() { printf("B"); } 510a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj}; 520a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj 530a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK: *** Dumping AST Record Layout 540a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK: *** Dumping AST Record Layout 550a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 0 | struct B 560a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 0 | struct B2 (primary base) 570a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 0 | (B2 vftable pointer) 580a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 4 | struct B0 (base) 590a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 4 | int a 600a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 8 | (B vbtable pointer) 610a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 32 | int a 620a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 48 | struct B1 (virtual base) 630a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 48 | int a 640a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: | [sizeof=64, align=16 650a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: | nvsize=48, nvalign=16] 660a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64: *** Dumping AST Record Layout 670a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64: *** Dumping AST Record Layout 680a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 0 | struct B 690a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 0 | struct B2 (primary base) 700a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 0 | (B2 vftable pointer) 710a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 8 | struct B0 (base) 720a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 8 | int a 730a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 16 | (B vbtable pointer) 740a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 32 | int a 750a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 48 | struct B1 (virtual base) 760a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 48 | int a 770a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: | [sizeof=64, align=16 780a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: | nvsize=48, nvalign=16] 790a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj 800a87e8d2d445c36fbd78787c3a553ea46bfe50desewardjstruct C : B3, B0, virtual B1 { 810a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj __declspec(align(16)) int a; 820a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj C() : a(0xf000000C) { printf(" C = %p\n\n", this); } 830a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj virtual void f() { printf("C"); } 840a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj}; 850a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj 867f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj// CHECK: *** Dumping AST Record Layout 870a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK: *** Dumping AST Record Layout 880a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 0 | struct C 890a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 0 | (C vftable pointer) 900a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 16 | struct B3 (base) 910a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 16 | (B3 vbtable pointer) 920a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 20 | struct B0 (base) 930a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 20 | int a 940a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 32 | int a 950a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 48 | struct B1 (virtual base) 960a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: 48 | int a 970a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: | [sizeof=64, align=16 980a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-NEXT: | nvsize=48, nvalign=16] 990a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64: *** Dumping AST Record Layout 1000a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64: *** Dumping AST Record Layout 1010a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 0 | struct C 1020a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 0 | (C vftable pointer) 1030a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 16 | struct B3 (base) 1040a87e8d2d445c36fbd78787c3a553ea46bfe50desewardj// CHECK-X64-NEXT: 16 | (B3 vbtable pointer) 1055ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 24 | struct B0 (base) 1065ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 24 | int a 1075ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 32 | int a 1085ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 48 | struct B1 (virtual base) 1097f3019bfbbbbc5356c351c5cd319c36fe731b806sewardj// CHECK-X64-NEXT: 48 | int a 1105ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: | [sizeof=64, align=16 1115ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: | nvsize=48, nvalign=16] 1125ac99069b0538adcb2f18b04b078ea27b00b4185sewardj 1135ac99069b0538adcb2f18b04b078ea27b00b4185sewardjstruct D : B4, B0, virtual B1 { 1145ac99069b0538adcb2f18b04b078ea27b00b4185sewardj __declspec(align(16)) int a; 1155ac99069b0538adcb2f18b04b078ea27b00b4185sewardj D() : a(0xf000000D) { printf(" D = %p\n\n", this); } 1165ac99069b0538adcb2f18b04b078ea27b00b4185sewardj virtual void f() { printf("D"); } 1175ac99069b0538adcb2f18b04b078ea27b00b4185sewardj}; 1185ac99069b0538adcb2f18b04b078ea27b00b4185sewardj 1195ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK: *** Dumping AST Record Layout 1205ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK: *** Dumping AST Record Layout 1215ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-NEXT: 0 | struct D 1225ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-NEXT: 0 | struct B4 (primary base) 1235ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-NEXT: 0 | (B4 vftable pointer) 1245ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-NEXT: 4 | (B4 vbtable pointer) 1255ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-NEXT: 8 | struct B0 (base) 1265ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-NEXT: 8 | int a 1275ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-NEXT: 16 | int a 1285ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-NEXT: 32 | struct B1 (virtual base) 1295ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-NEXT: 32 | int a 1305ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-NEXT: | [sizeof=48, align=16 1315ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-NEXT: | nvsize=32, nvalign=16] 1325ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64: *** Dumping AST Record Layout 1335ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64: *** Dumping AST Record Layout 1345ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 0 | struct D 1355ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 0 | struct B4 (primary base) 1365ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 0 | (B4 vftable pointer) 1375ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 8 | (B4 vbtable pointer) 1385ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 16 | struct B0 (base) 1395ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 16 | int a 1405ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 32 | int a 1415ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 48 | struct B1 (virtual base) 1425ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: 48 | int a 1435ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: | [sizeof=64, align=16 1445ac99069b0538adcb2f18b04b078ea27b00b4185sewardj// CHECK-X64-NEXT: | nvsize=48, nvalign=16] 1455ac99069b0538adcb2f18b04b078ea27b00b4185sewardj 1465ac99069b0538adcb2f18b04b078ea27b00b4185sewardjint a[ 1475ac99069b0538adcb2f18b04b078ea27b00b4185sewardjsizeof(A)+ 1485ac99069b0538adcb2f18b04b078ea27b00b4185sewardjsizeof(B)+ 1495ac99069b0538adcb2f18b04b078ea27b00b4185sewardjsizeof(C)+ 1505ac99069b0538adcb2f18b04b078ea27b00b4185sewardjsizeof(D)]; 1515ac99069b0538adcb2f18b04b078ea27b00b4185sewardj