xref: /aosp_15_r20/external/clang/test/Layout/ms-x86-empty-layout.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
2*67e74705SXin Li // RUN:            | FileCheck %s
3*67e74705SXin Li // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
4*67e74705SXin Li // RUN:            | FileCheck %s
5*67e74705SXin Li 
6*67e74705SXin Li struct EmptyIntMemb {
7*67e74705SXin Li   int FlexArrayMemb[0];
8*67e74705SXin Li };
9*67e74705SXin Li // CHECK:       *** Dumping AST Record Layout
10*67e74705SXin Li // CHECK-NEXT:  0 | struct EmptyIntMemb
11*67e74705SXin Li // CHECK-NEXT:  0 | int [0] FlexArrayMemb
12*67e74705SXin Li // CHECK-NEXT:    | [sizeof=4, align=4
13*67e74705SXin Li 
14*67e74705SXin Li struct EmptyLongLongMemb {
15*67e74705SXin Li   long long FlexArrayMemb[0];
16*67e74705SXin Li };
17*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
18*67e74705SXin Li // CHECK-NEXT:  0 | struct EmptyLongLongMemb
19*67e74705SXin Li // CHECK-NEXT:  0 | long long [0] FlexArrayMemb
20*67e74705SXin Li // CHECK-NEXT:    | [sizeof=4, align=8
21*67e74705SXin Li 
22*67e74705SXin Li struct EmptyAligned2LongLongMemb {
23*67e74705SXin Li   long long __declspec(align(2)) FlexArrayMemb[0];
24*67e74705SXin Li };
25*67e74705SXin Li 
26*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
27*67e74705SXin Li // CHECK-NEXT:  0 | struct EmptyAligned2LongLongMemb
28*67e74705SXin Li // CHECK-NEXT:  0 | long long [0] FlexArrayMemb
29*67e74705SXin Li // CHECK-NEXT:    | [sizeof=4, align=8
30*67e74705SXin Li 
31*67e74705SXin Li struct EmptyAligned8LongLongMemb {
32*67e74705SXin Li   long long __declspec(align(8)) FlexArrayMemb[0];
33*67e74705SXin Li };
34*67e74705SXin Li 
35*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
36*67e74705SXin Li // CHECK-NEXT:  0 | struct EmptyAligned8LongLongMemb
37*67e74705SXin Li // CHECK-NEXT:  0 | long long [0] FlexArrayMemb
38*67e74705SXin Li // CHECK-NEXT:    | [sizeof=8, align=8
39*67e74705SXin Li 
40*67e74705SXin Li #pragma pack(1)
41*67e74705SXin Li struct __declspec(align(4)) EmptyPackedAligned4LongLongMemb {
42*67e74705SXin Li   long long FlexArrayMemb[0];
43*67e74705SXin Li };
44*67e74705SXin Li #pragma pack()
45*67e74705SXin Li 
46*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
47*67e74705SXin Li // CHECK-NEXT:  0 | struct EmptyPackedAligned4LongLongMemb
48*67e74705SXin Li // CHECK-NEXT:  0 | long long [0] FlexArrayMemb
49*67e74705SXin Li // CHECK-NEXT:    | [sizeof=4, align=4
50*67e74705SXin Li 
51*67e74705SXin Li #pragma pack(1)
52*67e74705SXin Li struct EmptyPackedAligned8LongLongMemb {
53*67e74705SXin Li   long long __declspec(align(8)) FlexArrayMemb[0];
54*67e74705SXin Li };
55*67e74705SXin Li #pragma pack()
56*67e74705SXin Li 
57*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
58*67e74705SXin Li // CHECK-NEXT:  0 | struct EmptyPackedAligned8LongLongMemb
59*67e74705SXin Li // CHECK-NEXT:  0 | long long [0] FlexArrayMemb
60*67e74705SXin Li // CHECK-NEXT:    | [sizeof=8, align=8
61*67e74705SXin Li 
62*67e74705SXin Li 
63*67e74705SXin Li int a[
64*67e74705SXin Li sizeof(struct EmptyIntMemb)+
65*67e74705SXin Li sizeof(struct EmptyLongLongMemb)+
66*67e74705SXin Li sizeof(struct EmptyAligned2LongLongMemb)+
67*67e74705SXin Li sizeof(struct EmptyAligned8LongLongMemb)+
68*67e74705SXin Li sizeof(struct EmptyPackedAligned4LongLongMemb)+
69*67e74705SXin Li sizeof(struct EmptyPackedAligned8LongLongMemb)+
70*67e74705SXin Li 0];
71