r218963 - MS ABI: Add an additional test for empty structs in C

David Majnemer david.majnemer at gmail.com
Fri Oct 3 00:41:09 PDT 2014


Author: majnemer
Date: Fri Oct  3 02:41:09 2014
New Revision: 218963

URL: http://llvm.org/viewvc/llvm-project?rev=218963&view=rev
Log:
MS ABI: Add an additional test for empty structs in C

Empty structs in C differ from those in C++.
- C++ requires that empty types have size 1; alignment requirements may
  increase the size of the struct.
- The C implementation doesn't let empty structs have a size under 4
  bytes.  Again, alignment requirements may increase the struct's size.

Add a test to stress these differences.

Added:
    cfe/trunk/test/Layout/ms-x86-empty-layout.c

Added: cfe/trunk/test/Layout/ms-x86-empty-layout.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Layout/ms-x86-empty-layout.c?rev=218963&view=auto
==============================================================================
--- cfe/trunk/test/Layout/ms-x86-empty-layout.c (added)
+++ cfe/trunk/test/Layout/ms-x86-empty-layout.c Fri Oct  3 02:41:09 2014
@@ -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: <ASTRecordLayout
+// CHECK:     Size:32
+// CHECK:     Alignment:32
+// CHECK:     FieldOffsets: [0]>
+
+struct EmptyLongLongMemb {
+  long long FlexArrayMemb[0];
+};
+// CHECK: *** Dumping AST Record Layout
+// CHECK: Type: struct EmptyLongLongMemb
+// CHECK: Record: 
+// CHECK: Layout: <ASTRecordLayout
+// CHECK:     Size:32
+// CHECK:     Alignment:64
+// CHECK:     FieldOffsets: [0]>
+
+struct EmptyAligned2LongLongMemb {
+  long long __declspec(align(2)) FlexArrayMemb[0];
+};
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK: Type: struct EmptyAligned2LongLongMemb
+// CHECK: Record: 
+// CHECK: Layout: <ASTRecordLayout
+// CHECK:     Size:32
+// CHECK:     Alignment:64
+// CHECK:     FieldOffsets: [0]>
+
+struct EmptyAligned8LongLongMemb {
+  long long __declspec(align(8)) FlexArrayMemb[0];
+};
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK: Type: struct EmptyAligned8LongLongMemb
+// CHECK: Record: 
+// CHECK: Layout: <ASTRecordLayout
+// CHECK:     Size:64
+// CHECK:     Alignment:64
+// CHECK:     FieldOffsets: [0]>
+
+#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: <ASTRecordLayout
+// CHECK:     Size:32
+// CHECK:     Alignment:32
+// CHECK:     FieldOffsets: [0]>
+
+#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: <ASTRecordLayout
+// CHECK:     Size:64
+// CHECK:     Alignment:64
+// CHECK:     FieldOffsets: [0]>
+
+
+int a[
+sizeof(struct EmptyIntMemb)+
+sizeof(struct EmptyLongLongMemb)+
+sizeof(struct EmptyAligned2LongLongMemb)+
+sizeof(struct EmptyAligned8LongLongMemb)+
+sizeof(struct EmptyPackedAligned4LongLongMemb)+
+sizeof(struct EmptyPackedAligned8LongLongMemb)+
+0];





More information about the cfe-commits mailing list