| // RUN: %clang_cc1 -w -triple=x86_64-pc-win32 -fms-compatibility -fdump-record-layouts-simple -foverride-record-layout=%S/Inputs/override-layout-virtual-base.layout %s | FileCheck --check-prefix=SIMPLE %s |
| // RUN: %clang_cc1 -w -triple=x86_64-pc-win32 -fms-compatibility -fdump-record-layouts -foverride-record-layout=%S/Inputs/override-layout-virtual-base.layout %s | FileCheck %s |
| |
| struct S1 { |
| int a; |
| }; |
| |
| struct S2 : virtual S1 { |
| virtual void foo() {} |
| }; |
| |
| // SIMPLE: Type: struct S3 |
| // SIMPLE: FieldOffsets: [64] |
| struct S3 : S2 { |
| char b; |
| }; |
| |
| struct S4 { |
| }; |
| |
| struct S5 : S4 { |
| virtual void foo() {} |
| }; |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK: 0 | struct S2 |
| // CHECK-NEXT: 0 | (S2 vftable pointer) |
| // CHECK-NEXT: 8 | (S2 vbtable pointer) |
| // CHECK-NEXT: 8 | struct S1 (virtual base) |
| // CHECK-NEXT: 8 | int a |
| // CHECK-NEXT: | [sizeof=8, align=8, |
| // CHECK-NEXT: | nvsize=8, nvalign=8] |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK: 0 | struct S3 |
| // CHECK-NEXT: 0 | struct S2 (primary base) |
| // CHECK-NEXT: 0 | (S2 vftable pointer) |
| // CHECK-NEXT: 8 | (S2 vbtable pointer) |
| // CHECK-NEXT: 8 | char b |
| // CHECK-NEXT: 16 | struct S1 (virtual base) |
| // CHECK-NEXT: 16 | int a |
| // CHECK-NEXT: | [sizeof=24, align=8, |
| // CHECK-NEXT: | nvsize=16, nvalign=8] |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK: 0 | struct S5 |
| // CHECK-NEXT: 0 | (S5 vftable pointer) |
| // CHECK-NEXT: 0 | struct S4 (base) (empty) |
| // CHECK-NEXT: | [sizeof=8, align=8, |
| // CHECK-NEXT: | nvsize=8, nvalign=8] |
| |
| void use_structs() { |
| S1 s1s[sizeof(S1)]; |
| S2 s2s[sizeof(S2)]; |
| S3 s3s[sizeof(S3)]; |
| S4 s4s[sizeof(S4)]; |
| S5 s5s[sizeof(S5)]; |
| } |