xref: /llvm-project/clang/test/CodeGen/object-size-flex-array.c (revision 7f93ae808634e33e4dc9bce753c909aa5f9a6eb4)
1*7f93ae80SBill Wendling // RUN: %clang                        -target x86_64 -O2 -S -emit-llvm %s -o - 2>&1 | FileCheck --check-prefixes=CHECK,CHECK-NO-STRICT %s
2*7f93ae80SBill Wendling // RUN: %clang -fstrict-flex-arrays=0 -target x86_64 -O2 -S -emit-llvm %s -o - 2>&1 | FileCheck --check-prefixes=CHECK,CHECK-STRICT-0 %s
3*7f93ae80SBill Wendling // RUN: %clang -fstrict-flex-arrays=1 -target x86_64 -O2 -S -emit-llvm %s -o - 2>&1 | FileCheck --check-prefixes=CHECK,CHECK-STRICT-1 %s
4*7f93ae80SBill Wendling // RUN: %clang -fstrict-flex-arrays=2 -target x86_64 -O2 -S -emit-llvm %s -o - 2>&1 | FileCheck --check-prefixes=CHECK,CHECK-STRICT-2 %s
5*7f93ae80SBill Wendling // RUN: %clang -fstrict-flex-arrays=3 -target x86_64 -O2 -S -emit-llvm %s -o - 2>&1 | FileCheck --check-prefixes=CHECK,CHECK-STRICT-3 %s
6f764dc99Sserge-sans-paille 
7f764dc99Sserge-sans-paille #define OBJECT_SIZE_BUILTIN __builtin_object_size
8f764dc99Sserge-sans-paille 
9f764dc99Sserge-sans-paille typedef struct {
10f764dc99Sserge-sans-paille   float f;
11f764dc99Sserge-sans-paille   double c[];
12f764dc99Sserge-sans-paille } foo_t;
13f764dc99Sserge-sans-paille 
14f764dc99Sserge-sans-paille typedef struct {
15f764dc99Sserge-sans-paille   float f;
16f764dc99Sserge-sans-paille   double c[0];
17f764dc99Sserge-sans-paille } foo0_t;
18f764dc99Sserge-sans-paille 
19f764dc99Sserge-sans-paille typedef struct {
20f764dc99Sserge-sans-paille   float f;
21f764dc99Sserge-sans-paille   double c[1];
22f764dc99Sserge-sans-paille } foo1_t;
23f764dc99Sserge-sans-paille 
24f764dc99Sserge-sans-paille typedef struct {
25f764dc99Sserge-sans-paille   float f;
26f764dc99Sserge-sans-paille   double c[2];
27f764dc99Sserge-sans-paille } foo2_t;
28f764dc99Sserge-sans-paille 
29e0746a8aSserge-sans-paille // CHECK-LABEL: @bar(
bar(foo_t * f)30f764dc99Sserge-sans-paille unsigned bar(foo_t *f) {
31*7f93ae80SBill Wendling   // CHECK-NO-STRICT: ret i32 -1
32*7f93ae80SBill Wendling   // CHECK-STRICT-0: ret i32 -1
33*7f93ae80SBill Wendling   // CHECK-STRICT-1: ret i32 -1
34*7f93ae80SBill Wendling   // CHECK-STRICT-2: ret i32 -1
35*7f93ae80SBill Wendling   // CHECK-STRICT-3: ret i32 -1
36f764dc99Sserge-sans-paille   return OBJECT_SIZE_BUILTIN(f->c, 1);
37f764dc99Sserge-sans-paille }
38f764dc99Sserge-sans-paille 
39e0746a8aSserge-sans-paille // CHECK-LABEL: @bar0(
bar0(foo0_t * f)40f764dc99Sserge-sans-paille unsigned bar0(foo0_t *f) {
41*7f93ae80SBill Wendling   // CHECK-NO-STRICT: ret i32 -1
42*7f93ae80SBill Wendling   // CHECK-STRICT-0: ret i32 -1
43*7f93ae80SBill Wendling   // CHECK-STRICT-1: ret i32 -1
44*7f93ae80SBill Wendling   // CHECK-STRICT-2: ret i32 -1
45*7f93ae80SBill Wendling   // CHECK-STRICT-3: ret i32 0
46f764dc99Sserge-sans-paille   return OBJECT_SIZE_BUILTIN(f->c, 1);
47f764dc99Sserge-sans-paille }
48f764dc99Sserge-sans-paille 
49e0746a8aSserge-sans-paille // CHECK-LABEL: @bar1(
bar1(foo1_t * f)50f764dc99Sserge-sans-paille unsigned bar1(foo1_t *f) {
51*7f93ae80SBill Wendling   // CHECK-NO-STRICT: ret i32 -1
52*7f93ae80SBill Wendling   // CHECK-STRICT-0: ret i32 -1
53*7f93ae80SBill Wendling   // CHECK-STRICT-1: ret i32 -1
54f764dc99Sserge-sans-paille   // CHECK-STRICT-2: ret i32 8
55*7f93ae80SBill Wendling   // CHECK-STRICT-3: ret i32 8
56f764dc99Sserge-sans-paille   return OBJECT_SIZE_BUILTIN(f->c, 1);
57f764dc99Sserge-sans-paille }
58f764dc99Sserge-sans-paille 
59e0746a8aSserge-sans-paille // CHECK-LABEL: @bar2(
bar2(foo2_t * f)60f764dc99Sserge-sans-paille unsigned bar2(foo2_t *f) {
61*7f93ae80SBill Wendling   // CHECK-NO-STRICT: ret i32 -1
62*7f93ae80SBill Wendling   // CHECK-STRICT-0: ret i32 -1
63f764dc99Sserge-sans-paille   // CHECK-STRICT-1: ret i32 16
64f764dc99Sserge-sans-paille   // CHECK-STRICT-2: ret i32 16
65*7f93ae80SBill Wendling   // CHECK-STRICT-3: ret i32 16
66f764dc99Sserge-sans-paille   return OBJECT_SIZE_BUILTIN(f->c, 1);
67f764dc99Sserge-sans-paille }
68f764dc99Sserge-sans-paille 
69*7f93ae80SBill Wendling #define DYNAMIC_OBJECT_SIZE_BUILTIN __builtin_dynamic_object_size
70*7f93ae80SBill Wendling 
71*7f93ae80SBill Wendling // CHECK-LABEL: @dyn_bar(
dyn_bar(foo_t * f)72*7f93ae80SBill Wendling unsigned dyn_bar(foo_t *f) {
73*7f93ae80SBill Wendling   // CHECK-NO-STRICT: ret i32 -1
74*7f93ae80SBill Wendling   // CHECK-STRICT-0: ret i32 -1
75*7f93ae80SBill Wendling   // CHECK-STRICT-1: ret i32 -1
76*7f93ae80SBill Wendling   // CHECK-STRICT-2: ret i32 -1
77*7f93ae80SBill Wendling   // CHECK-STRICT-3: ret i32 -1
78*7f93ae80SBill Wendling   return DYNAMIC_OBJECT_SIZE_BUILTIN(f->c, 1);
79*7f93ae80SBill Wendling }
80*7f93ae80SBill Wendling 
81*7f93ae80SBill Wendling // CHECK-LABEL: @dyn_bar0(
dyn_bar0(foo0_t * f)82*7f93ae80SBill Wendling unsigned dyn_bar0(foo0_t *f) {
83*7f93ae80SBill Wendling   // CHECK-NO-STRICT: ret i32 -1
84*7f93ae80SBill Wendling   // CHECK-STRICT-0: ret i32 -1
85*7f93ae80SBill Wendling   // CHECK-STRICT-1: ret i32 -1
86*7f93ae80SBill Wendling   // CHECK-STRICT-2: ret i32 -1
87*7f93ae80SBill Wendling   // CHECK-STRICT-3: ret i32 0
88*7f93ae80SBill Wendling   return DYNAMIC_OBJECT_SIZE_BUILTIN(f->c, 1);
89*7f93ae80SBill Wendling }
90*7f93ae80SBill Wendling 
91*7f93ae80SBill Wendling // CHECK-LABEL: @dyn_bar1(
dyn_bar1(foo1_t * f)92*7f93ae80SBill Wendling unsigned dyn_bar1(foo1_t *f) {
93*7f93ae80SBill Wendling   // CHECK-NO-STRICT: ret i32 -1
94*7f93ae80SBill Wendling   // CHECK-STRICT-0: ret i32 -1
95*7f93ae80SBill Wendling   // CHECK-STRICT-1: ret i32 -1
96*7f93ae80SBill Wendling   // CHECK-STRICT-2: ret i32 8
97*7f93ae80SBill Wendling   // CHECK-STRICT-3: ret i32 8
98*7f93ae80SBill Wendling   return DYNAMIC_OBJECT_SIZE_BUILTIN(f->c, 1);
99*7f93ae80SBill Wendling }
100*7f93ae80SBill Wendling 
101*7f93ae80SBill Wendling // CHECK-LABEL: @dyn_bar2(
dyn_bar2(foo2_t * f)102*7f93ae80SBill Wendling unsigned dyn_bar2(foo2_t *f) {
103*7f93ae80SBill Wendling   // CHECK-NO-STRICT: ret i32 -1
104*7f93ae80SBill Wendling   // CHECK-STRICT-0: ret i32 -1
105*7f93ae80SBill Wendling   // CHECK-STRICT-1: ret i32 16
106*7f93ae80SBill Wendling   // CHECK-STRICT-2: ret i32 16
107*7f93ae80SBill Wendling   // CHECK-STRICT-3: ret i32 16
108*7f93ae80SBill Wendling   return DYNAMIC_OBJECT_SIZE_BUILTIN(f->c, 1);
109*7f93ae80SBill Wendling }
110*7f93ae80SBill Wendling 
111f764dc99Sserge-sans-paille // Also checks for non-trailing flex-array like members
112f764dc99Sserge-sans-paille 
113f764dc99Sserge-sans-paille typedef struct {
114f764dc99Sserge-sans-paille   double c[0];
115f764dc99Sserge-sans-paille   float f;
116f764dc99Sserge-sans-paille } foofoo0_t;
117f764dc99Sserge-sans-paille 
118f764dc99Sserge-sans-paille typedef struct {
119f764dc99Sserge-sans-paille   double c[1];
120f764dc99Sserge-sans-paille   float f;
121f764dc99Sserge-sans-paille } foofoo1_t;
122f764dc99Sserge-sans-paille 
123f764dc99Sserge-sans-paille typedef struct {
124f764dc99Sserge-sans-paille   double c[2];
125f764dc99Sserge-sans-paille   float f;
126f764dc99Sserge-sans-paille } foofoo2_t;
127f764dc99Sserge-sans-paille 
128e0746a8aSserge-sans-paille // CHECK-LABEL: @babar0(
babar0(foofoo0_t * f)129f764dc99Sserge-sans-paille unsigned babar0(foofoo0_t *f) {
130*7f93ae80SBill Wendling   // CHECK-NO-STRICT: ret i32 0
131f764dc99Sserge-sans-paille   // CHECK-STRICT-0: ret i32 0
132f764dc99Sserge-sans-paille   // CHECK-STRICT-1: ret i32 0
133f764dc99Sserge-sans-paille   // CHECK-STRICT-2: ret i32 0
134*7f93ae80SBill Wendling   // CHECK-STRICT-3: ret i32 0
135f764dc99Sserge-sans-paille   return OBJECT_SIZE_BUILTIN(f->c, 1);
136f764dc99Sserge-sans-paille }
137f764dc99Sserge-sans-paille 
138e0746a8aSserge-sans-paille // CHECK-LABEL: @babar1(
babar1(foofoo1_t * f)139f764dc99Sserge-sans-paille unsigned babar1(foofoo1_t *f) {
140*7f93ae80SBill Wendling   // CHECK-NO-STRICT: ret i32 8
141f764dc99Sserge-sans-paille   // CHECK-STRICT-0: ret i32 8
142f764dc99Sserge-sans-paille   // CHECK-STRICT-1: ret i32 8
143f764dc99Sserge-sans-paille   // CHECK-STRICT-2: ret i32 8
144*7f93ae80SBill Wendling   // CHECK-STRICT-3: ret i32 8
145f764dc99Sserge-sans-paille   return OBJECT_SIZE_BUILTIN(f->c, 1);
146f764dc99Sserge-sans-paille }
147f764dc99Sserge-sans-paille 
148e0746a8aSserge-sans-paille // CHECK-LABEL: @babar2(
babar2(foofoo2_t * f)149f764dc99Sserge-sans-paille unsigned babar2(foofoo2_t *f) {
150*7f93ae80SBill Wendling   // CHECK-NO-STRICT: ret i32 16
151f764dc99Sserge-sans-paille   // CHECK-STRICT-0: ret i32 16
152f764dc99Sserge-sans-paille   // CHECK-STRICT-1: ret i32 16
153f764dc99Sserge-sans-paille   // CHECK-STRICT-2: ret i32 16
154*7f93ae80SBill Wendling   // CHECK-STRICT-3: ret i32 16
155f764dc99Sserge-sans-paille   return OBJECT_SIZE_BUILTIN(f->c, 1);
156f764dc99Sserge-sans-paille }
157