1// RUN: %clang_cc1 -x c -debug-info-kind=limited -emit-llvm -triple x86_64-apple-darwin -o - %s | FileCheck %s
2
3// CHECK: %struct.layout0 = type { i8, %struct.size8, i8 }
4// CHECK: %struct.layout1 = type <{ i8, %struct.size8_anon, i8, [2 x i8] }>
5// CHECK: %struct.layout2 = type <{ i8, %struct.size8_pack1, i8 }>
6// CHECK: %struct.layout3 = type <{ i8, [3 x i8], %struct.size8_pack4, i8, [3 x i8] }>
7
8// ---------------------------------------------------------------------
9// Not packed.
10// ---------------------------------------------------------------------
11struct size8 {
12  int i : 4;
13  long long l : 60;
14};
15struct layout0 {
16  char l0_ofs0;
17  struct size8 l0_ofs8;
18  int l0_ofs16 : 1;
19};
20// CHECK: l0_ofs0
21// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l0_ofs8",
22// CHECK-SAME:     {{.*}}size: 64, align: 64, offset: 64)
23// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l0_ofs16",
24// CHECK-SAME:     {{.*}}size: 1, align: 32, offset: 128, flags: DIFlagBitField, extraData: i64 128)
25
26
27// ---------------------------------------------------------------------
28// Implicitly packed.
29// ---------------------------------------------------------------------
30struct size8_anon {
31  int : 4;
32  long long : 60;
33};
34struct layout1 {
35  char l1_ofs0;
36  struct size8_anon l1_ofs1;
37  int l1_ofs9 : 1;
38};
39// CHECK: l1_ofs0
40// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l1_ofs1",
41// CHECK-SAME:     {{.*}}size: 64, align: 8, offset: 8)
42// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l1_ofs9",
43// CHECK-SAME:     {{.*}}size: 1, align: 32, offset: 72, flags: DIFlagBitField, extraData: i64 72)
44
45
46// ---------------------------------------------------------------------
47// Explicitly packed.
48// ---------------------------------------------------------------------
49#pragma pack(1)
50struct size8_pack1 {
51  int i : 4;
52  long long l : 60;
53};
54struct layout2 {
55  char l2_ofs0;
56  struct size8_pack1 l2_ofs1;
57  int l2_ofs9 : 1;
58};
59#pragma pack()
60// CHECK: l2_ofs0
61// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs1",
62// CHECK-SAME:     {{.*}}size: 64, align: 8, offset: 8)
63// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs9",
64// CHECK-SAME:     {{.*}}size: 1, align: 32, offset: 72, flags: DIFlagBitField, extraData: i64 72)
65
66
67
68// ---------------------------------------------------------------------
69// Explicitly packed with different alignment.
70// ---------------------------------------------------------------------
71#pragma pack(4)
72struct size8_pack4 {
73  int i : 4;
74  long long l : 60;
75};
76struct layout3 {
77  char l3_ofs0;
78  struct size8_pack4 l3_ofs4;
79  int l3_ofs12 : 1;
80};
81#pragma pack()
82// CHECK: l3_ofs0
83// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs4",
84// CHECK-SAME:     {{.*}}size: 64, align: 32, offset: 32)
85// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs12",
86// CHECK-SAME:     {{.*}}size: 1, align: 32, offset: 96, flags: DIFlagBitField, extraData: i64 96)
87
88struct layout0 l0;
89struct layout1 l1;
90struct layout2 l2;
91struct layout3 l3;
92