From a5472dedd95b353727d89a932c637cef19e95124 Mon Sep 17 00:00:00 2001
From: David Majnemer <david.majnemer@gmail.com>
Date: Fri, 3 Oct 2014 07:41:09 +0000
Subject: [PATCH] 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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218963 91177308-0d34-0410-b5e6-96231b3b80d8
---
 test/Layout/ms-x86-empty-layout.c | 88 +++++++++++++++++++++++++++++++
 1 file changed, 88 insertions(+)
 create mode 100644 test/Layout/ms-x86-empty-layout.c

diff --git a/test/Layout/ms-x86-empty-layout.c b/test/Layout/ms-x86-empty-layout.c
new file mode 100644
index 00000000000..faca0be0a9c
--- /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: <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];
-- 
GitLab