From 06d4ba388873e6d1cfa9cd715a8935ecc8cd2097 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Sun, 18 Jan 2015 16:23:48 +0000 Subject: Vendor import of clang RELEASE_360/rc1 tag r226102 (effectively, 3.6.0 RC1): https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_360/rc1@226102 --- test/Layout/itanium-union-bitfield.cpp | 29 +++++++ test/Layout/ms-x86-basic-layout.cpp | 32 +++++++ test/Layout/ms-x86-empty-layout.c | 88 +++++++++++++++++++ test/Layout/ms-x86-pack-and-align.cpp | 154 +++++++++++++++++++++++++++++++++ test/Layout/ms-x86-vtordisp.cpp | 26 ++++++ 5 files changed, 329 insertions(+) create mode 100644 test/Layout/itanium-union-bitfield.cpp create mode 100644 test/Layout/ms-x86-empty-layout.c (limited to 'test/Layout') diff --git a/test/Layout/itanium-union-bitfield.cpp b/test/Layout/itanium-union-bitfield.cpp new file mode 100644 index 000000000000..b06fd36071e9 --- /dev/null +++ b/test/Layout/itanium-union-bitfield.cpp @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -emit-llvm-only -triple %itanium_abi_triple -fdump-record-layouts %s 2>/dev/null \ +// RUN: | FileCheck %s + +union A { + int f1: 3; + A(); +}; + +A::A() {} + +union B { + char f1: 35; + B(); +}; + +B::B() {} + +// CHECK:*** Dumping AST Record Layout +// CHECK-NEXT: 0 | union A +// CHECK-NEXT: 0 | int f1 +// CHECK-NEXT: | [sizeof=4, dsize=1, align=4 +// CHECK-NEXT: | nvsize=1, nvalign=4] + +// CHECK:*** Dumping AST Record Layout +// CHECK-NEXT: 0 | union B +// CHECK-NEXT: 0 | char f1 +// CHECK-NEXT: | [sizeof=8, dsize=5, align=4 +// CHECK-NEXT: | nvsize=5, nvalign=4] + diff --git a/test/Layout/ms-x86-basic-layout.cpp b/test/Layout/ms-x86-basic-layout.cpp index b6ffeee7114a..aac7aed06019 100644 --- a/test/Layout/ms-x86-basic-layout.cpp +++ b/test/Layout/ms-x86-basic-layout.cpp @@ -816,6 +816,36 @@ struct RecordArrayTypedef { // CHECK-X64-NEXT: | [sizeof=16, align=4 // CHECK-X64-NEXT: | nvsize=16, nvalign=4] +struct EmptyIntMemb { + int FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct EmptyIntMemb +// CHECK-NEXT: 0 | int [0] FlexArrayMemb +// CHECK-NEXT: | [sizeof=1, align=4 +// CHECK-NEXT: | nvsize=0, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct EmptyIntMemb +// CHECK-X64-NEXT: 0 | int [0] FlexArrayMemb +// CHECK-X64-NEXT: | [sizeof=4, align=4 +// CHECK-X64-NEXT: | nvsize=0, nvalign=4] + +struct EmptyLongLongMemb { + long long FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct EmptyLongLongMemb +// CHECK-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-NEXT: | [sizeof=1, align=8 +// CHECK-NEXT: | nvsize=0, nvalign=8] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct EmptyLongLongMemb +// CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-X64-NEXT: | [sizeof=8, align=8 +// CHECK-X64-NEXT: | nvsize=0, nvalign=8] + int a[ sizeof(TestF0)+ sizeof(TestF1)+ @@ -840,4 +870,6 @@ sizeof(F6)+ sizeof(ArrayFieldOfRecords)+ sizeof(ArrayOfArrayFieldOfRecords)+ sizeof(RecordArrayTypedef)+ +sizeof(EmptyIntMemb)+ +sizeof(EmptyLongLongMemb)+ 0]; diff --git a/test/Layout/ms-x86-empty-layout.c b/test/Layout/ms-x86-empty-layout.c new file mode 100644 index 000000000000..faca0be0a9c0 --- /dev/null +++ b/test/Layout/ms-x86-empty-layout.c @@ -0,0 +1,88 @@ +// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>/dev/null \ +// RUN: | FileCheck %s +// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>/dev/null \ +// RUN: | FileCheck %s + +struct EmptyIntMemb { + int FlexArrayMemb[0]; +}; +// CHECK: *** Dumping AST Record Layout +// CHECK: Type: struct EmptyIntMemb +// CHECK: Record: +// CHECK: Layout: + +struct EmptyLongLongMemb { + long long FlexArrayMemb[0]; +}; +// CHECK: *** Dumping AST Record Layout +// CHECK: Type: struct EmptyLongLongMemb +// CHECK: Record: +// CHECK: Layout: + +struct EmptyAligned2LongLongMemb { + long long __declspec(align(2)) FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK: Type: struct EmptyAligned2LongLongMemb +// CHECK: Record: +// CHECK: Layout: + +struct EmptyAligned8LongLongMemb { + long long __declspec(align(8)) FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK: Type: struct EmptyAligned8LongLongMemb +// CHECK: Record: +// CHECK: Layout: + +#pragma pack(1) +struct __declspec(align(4)) EmptyPackedAligned4LongLongMemb { + long long FlexArrayMemb[0]; +}; +#pragma pack() + +// CHECK: *** Dumping AST Record Layout +// CHECK: Type: struct EmptyPackedAligned4LongLongMemb +// CHECK: Record: +// CHECK: Layout: + +#pragma pack(1) +struct EmptyPackedAligned8LongLongMemb { + long long __declspec(align(8)) FlexArrayMemb[0]; +}; +#pragma pack() + +// CHECK: *** Dumping AST Record Layout +// CHECK: Type: struct EmptyPackedAligned8LongLongMemb +// CHECK: Record: +// CHECK: Layout: + + +int a[ +sizeof(struct EmptyIntMemb)+ +sizeof(struct EmptyLongLongMemb)+ +sizeof(struct EmptyAligned2LongLongMemb)+ +sizeof(struct EmptyAligned8LongLongMemb)+ +sizeof(struct EmptyPackedAligned4LongLongMemb)+ +sizeof(struct EmptyPackedAligned8LongLongMemb)+ +0]; diff --git a/test/Layout/ms-x86-pack-and-align.cpp b/test/Layout/ms-x86-pack-and-align.cpp index 5e1aae1ca757..9783233d66ac 100644 --- a/test/Layout/ms-x86-pack-and-align.cpp +++ b/test/Layout/ms-x86-pack-and-align.cpp @@ -652,7 +652,154 @@ struct OD : OC {}; // CHECK-X64-NEXT: | [sizeof=12, align=1 // CHECK-X64-NEXT: | nvsize=8, nvalign=1] +struct __declspec(align(4)) PA { + int c; +}; + +typedef __declspec(align(8)) PA PB; +#pragma pack(push, 1) +struct PC { + char a; + PB x; +}; +#pragma pack(pop) + +// CHECK: *** Dumping AST Record Layout +// CHECK: 0 | struct PC +// CHECK-NEXT: 0 | char a +// CHECK-NEXT: 8 | struct PA x +// CHECK-NEXT: 8 | int c +// CHECK-NEXT: | [sizeof=4, align=4 +// CHECK-NEXT: | nvsize=4, nvalign=4] +// CHECK-NEXT: | [sizeof=16, align=8 +// CHECK-NEXT: | nvsize=12, nvalign=8] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64: 0 | struct PC +// CHECK-X64-NEXT: 0 | char a +// CHECK-X64-NEXT: 8 | struct PA x +// CHECK-X64-NEXT: 8 | int c +// CHECK-X64-NEXT: | [sizeof=4, align=4 +// CHECK-X64-NEXT: | nvsize=4, nvalign=4] +// CHECK-X64-NEXT: | [sizeof=16, align=8 +// CHECK-X64-NEXT: | nvsize=12, nvalign=8] + +typedef PB PD; + +#pragma pack(push, 1) +struct PE { + char a; + PD x; +}; +#pragma pack(pop) + +// CHECK: *** Dumping AST Record Layout +// CHECK: 0 | struct PE +// CHECK-NEXT: 0 | char a +// CHECK-NEXT: 8 | struct PA x +// CHECK-NEXT: 8 | int c +// CHECK-NEXT: | [sizeof=4, align=4 +// CHECK-NEXT: | nvsize=4, nvalign=4] +// CHECK-NEXT: | [sizeof=16, align=8 +// CHECK-NEXT: | nvsize=12, nvalign=8] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64: 0 | struct PE +// CHECK-X64-NEXT: 0 | char a +// CHECK-X64-NEXT: 8 | struct PA x +// CHECK-X64-NEXT: 8 | int c +// CHECK-X64-NEXT: | [sizeof=4, align=4 +// CHECK-X64-NEXT: | nvsize=4, nvalign=4] +// CHECK-X64-NEXT: | [sizeof=16, align=8 +// CHECK-X64-NEXT: | nvsize=12, nvalign=8] + +typedef int __declspec(align(2)) QA; +#pragma pack(push, 1) +struct QB { + char a; + QA b; +}; +#pragma pack(pop) + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct QB +// CHECK-NEXT: 0 | char a +// CHECK-NEXT: 2 | QA b +// CHECK-NEXT: | [sizeof=6, align=2 +// CHECK-NEXT: | nvsize=6, nvalign=2] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct QB +// CHECK-X64-NEXT: 0 | char a +// CHECK-X64-NEXT: 2 | QA b +// CHECK-X64-NEXT: | [sizeof=6, align=2 +// CHECK-X64-NEXT: | nvsize=6, nvalign=2] + +struct QC { + char a; + QA b; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct QC +// CHECK-NEXT: 0 | char a +// CHECK-NEXT: 4 | QA b +// CHECK-NEXT: | [sizeof=8, align=4 +// CHECK-NEXT: | nvsize=8, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct QC +// CHECK-X64-NEXT: 0 | char a +// CHECK-X64-NEXT: 4 | QA b +// CHECK-X64-NEXT: | [sizeof=8, align=4 +// CHECK-X64-NEXT: | nvsize=8, nvalign=4] + +struct QD { + char a; + QA b : 3; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct QD +// CHECK-NEXT: 0 | char a +// CHECK-NEXT: 4 | QA b +// CHECK-NEXT: | [sizeof=8, align=4 +// CHECK-NEXT: | nvsize=8, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct QD +// CHECK-X64-NEXT: 0 | char a +// CHECK-X64-NEXT: 4 | QA b +// CHECK-X64-NEXT: | [sizeof=8, align=4 +// CHECK-X64-NEXT: | nvsize=8, nvalign=4] + +struct __declspec(align(4)) EmptyAlignedLongLongMemb { + long long FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct EmptyAlignedLongLongMemb +// CHECK-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-NEXT: | [sizeof=8, align=8 +// CHECK-NEXT: | nvsize=0, nvalign=8] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct EmptyAlignedLongLongMemb +// CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-X64-NEXT: | [sizeof=8, align=8 +// CHECK-X64-NEXT: | nvsize=0, nvalign=8] + +#pragma pack(1) +struct __declspec(align(4)) EmptyPackedAlignedLongLongMemb { + long long FlexArrayMemb[0]; +}; +#pragma pack() + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct EmptyPackedAlignedLongLongMemb +// CHECK-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-NEXT: | [sizeof=4, align=4 +// CHECK-NEXT: | nvsize=0, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct EmptyPackedAlignedLongLongMemb +// CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-X64-NEXT: | [sizeof=4, align=4 +// CHECK-X64-NEXT: | nvsize=0, nvalign=4] int a[ sizeof(X)+ @@ -680,4 +827,11 @@ sizeof(RC)+ sizeof(RE)+ sizeof(ND)+ sizeof(OD)+ +sizeof(PC)+ +sizeof(PE)+ +sizeof(QB)+ +sizeof(QC)+ +sizeof(QD)+ +sizeof(EmptyAlignedLongLongMemb)+ +sizeof(EmptyPackedAlignedLongLongMemb)+ 0]; diff --git a/test/Layout/ms-x86-vtordisp.cpp b/test/Layout/ms-x86-vtordisp.cpp index 60779fb1975b..1b78d9fe8435 100644 --- a/test/Layout/ms-x86-vtordisp.cpp +++ b/test/Layout/ms-x86-vtordisp.cpp @@ -416,6 +416,31 @@ struct HC : virtual HB {}; // CHECK-X64-NEXT: | [sizeof=32, align=8 // CHECK-X64-NEXT: | nvsize=8, nvalign=8] +struct IA { + virtual void f(); +}; +struct __declspec(dllexport) IB : virtual IA { + virtual void f() = 0; + IB() {} +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct IB +// CHECK-NEXT: 0 | (IB vbtable pointer) +// CHECK-NEXT: 4 | struct IA (virtual base) +// CHECK-NEXT: 4 | (IA vftable pointer) +// CHECK-NEXT: | [sizeof=8, align=4 +// CHECK-NEXT: | nvsize=4, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct IB +// CHECK-X64-NEXT: 0 | (IB vbtable pointer) +// CHECK-X64-NEXT: 8 | struct IA (virtual base) +// CHECK-X64-NEXT: 8 | (IA vftable pointer) +// CHECK-X64-NEXT: | [sizeof=16, align=8 +// CHECK-X64-NEXT: | nvsize=8, nvalign=8] + int a[ sizeof(A)+ sizeof(C)+ @@ -428,4 +453,5 @@ sizeof(pragma_test3::C)+ sizeof(pragma_test4::C)+ sizeof(GD)+ sizeof(HC)+ +sizeof(IB)+ 0]; -- cgit v1.3