1*f764dc99Sserge-sans-paille // RUN: %clang -fstrict-flex-arrays=2 -target x86_64-apple-darwin -S -emit-llvm %s -o - 2>&1 | FileCheck --check-prefixes=CHECK,CHECK-STRICT-2 %s
2*f764dc99Sserge-sans-paille // RUN: %clang -fstrict-flex-arrays=1 -target x86_64-apple-darwin -S -emit-llvm %s -o - 2>&1 | FileCheck --check-prefixes=CHECK,CHECK-STRICT-1 %s
3*f764dc99Sserge-sans-paille // RUN: %clang -fstrict-flex-arrays=0 -target x86_64-apple-darwin -S -emit-llvm %s -o - 2>&1 | FileCheck --check-prefixes=CHECK,CHECK-STRICT-0 %s
4*f764dc99Sserge-sans-paille
5*f764dc99Sserge-sans-paille #define OBJECT_SIZE_BUILTIN __builtin_object_size
6*f764dc99Sserge-sans-paille
7*f764dc99Sserge-sans-paille typedef struct {
8*f764dc99Sserge-sans-paille float f;
9*f764dc99Sserge-sans-paille double c[];
10*f764dc99Sserge-sans-paille } foo_t;
11*f764dc99Sserge-sans-paille
12*f764dc99Sserge-sans-paille typedef struct {
13*f764dc99Sserge-sans-paille float f;
14*f764dc99Sserge-sans-paille double c[0];
15*f764dc99Sserge-sans-paille } foo0_t;
16*f764dc99Sserge-sans-paille
17*f764dc99Sserge-sans-paille typedef struct {
18*f764dc99Sserge-sans-paille float f;
19*f764dc99Sserge-sans-paille double c[1];
20*f764dc99Sserge-sans-paille } foo1_t;
21*f764dc99Sserge-sans-paille
22*f764dc99Sserge-sans-paille typedef struct {
23*f764dc99Sserge-sans-paille float f;
24*f764dc99Sserge-sans-paille double c[2];
25*f764dc99Sserge-sans-paille } foo2_t;
26*f764dc99Sserge-sans-paille
27*f764dc99Sserge-sans-paille // CHECK-LABEL: @bar
bar(foo_t * f)28*f764dc99Sserge-sans-paille unsigned bar(foo_t *f) {
29*f764dc99Sserge-sans-paille // CHECK-STRICT-0: ret i32 %
30*f764dc99Sserge-sans-paille // CHECK-STRICT-1: ret i32 %
31*f764dc99Sserge-sans-paille // CHECK-STRICT-2: ret i32 %
32*f764dc99Sserge-sans-paille return OBJECT_SIZE_BUILTIN(f->c, 1);
33*f764dc99Sserge-sans-paille }
34*f764dc99Sserge-sans-paille
35*f764dc99Sserge-sans-paille // CHECK-LABEL: @bar0
bar0(foo0_t * f)36*f764dc99Sserge-sans-paille unsigned bar0(foo0_t *f) {
37*f764dc99Sserge-sans-paille // CHECK-STRICT-0: ret i32 %
38*f764dc99Sserge-sans-paille // CHECK-STRICT-1: ret i32 %
39*f764dc99Sserge-sans-paille // CHECK-STRICT-2: ret i32 %
40*f764dc99Sserge-sans-paille return OBJECT_SIZE_BUILTIN(f->c, 1);
41*f764dc99Sserge-sans-paille }
42*f764dc99Sserge-sans-paille
43*f764dc99Sserge-sans-paille // CHECK-LABEL: @bar1
bar1(foo1_t * f)44*f764dc99Sserge-sans-paille unsigned bar1(foo1_t *f) {
45*f764dc99Sserge-sans-paille // CHECK-STRICT-0: ret i32 %
46*f764dc99Sserge-sans-paille // CHECK-STRICT-1: ret i32 %
47*f764dc99Sserge-sans-paille // CHECK-STRICT-2: ret i32 8
48*f764dc99Sserge-sans-paille return OBJECT_SIZE_BUILTIN(f->c, 1);
49*f764dc99Sserge-sans-paille }
50*f764dc99Sserge-sans-paille
51*f764dc99Sserge-sans-paille // CHECK-LABEL: @bar2
bar2(foo2_t * f)52*f764dc99Sserge-sans-paille unsigned bar2(foo2_t *f) {
53*f764dc99Sserge-sans-paille // CHECK-STRICT-0: ret i32 %
54*f764dc99Sserge-sans-paille // CHECK-STRICT-1: ret i32 16
55*f764dc99Sserge-sans-paille // CHECK-STRICT-2: ret i32 16
56*f764dc99Sserge-sans-paille return OBJECT_SIZE_BUILTIN(f->c, 1);
57*f764dc99Sserge-sans-paille }
58*f764dc99Sserge-sans-paille
59*f764dc99Sserge-sans-paille // Also checks for non-trailing flex-array like members
60*f764dc99Sserge-sans-paille
61*f764dc99Sserge-sans-paille typedef struct {
62*f764dc99Sserge-sans-paille double c[0];
63*f764dc99Sserge-sans-paille float f;
64*f764dc99Sserge-sans-paille } foofoo0_t;
65*f764dc99Sserge-sans-paille
66*f764dc99Sserge-sans-paille typedef struct {
67*f764dc99Sserge-sans-paille double c[1];
68*f764dc99Sserge-sans-paille float f;
69*f764dc99Sserge-sans-paille } foofoo1_t;
70*f764dc99Sserge-sans-paille
71*f764dc99Sserge-sans-paille typedef struct {
72*f764dc99Sserge-sans-paille double c[2];
73*f764dc99Sserge-sans-paille float f;
74*f764dc99Sserge-sans-paille } foofoo2_t;
75*f764dc99Sserge-sans-paille
76*f764dc99Sserge-sans-paille // CHECK-LABEL: @babar0
babar0(foofoo0_t * f)77*f764dc99Sserge-sans-paille unsigned babar0(foofoo0_t *f) {
78*f764dc99Sserge-sans-paille // CHECK-STRICT-0: ret i32 0
79*f764dc99Sserge-sans-paille // CHECK-STRICT-1: ret i32 0
80*f764dc99Sserge-sans-paille // CHECK-STRICT-2: ret i32 0
81*f764dc99Sserge-sans-paille return OBJECT_SIZE_BUILTIN(f->c, 1);
82*f764dc99Sserge-sans-paille }
83*f764dc99Sserge-sans-paille
84*f764dc99Sserge-sans-paille // CHECK-LABEL: @babar1
babar1(foofoo1_t * f)85*f764dc99Sserge-sans-paille unsigned babar1(foofoo1_t *f) {
86*f764dc99Sserge-sans-paille // CHECK-STRICT-0: ret i32 8
87*f764dc99Sserge-sans-paille // CHECK-STRICT-1: ret i32 8
88*f764dc99Sserge-sans-paille // CHECK-STRICT-2: ret i32 8
89*f764dc99Sserge-sans-paille return OBJECT_SIZE_BUILTIN(f->c, 1);
90*f764dc99Sserge-sans-paille }
91*f764dc99Sserge-sans-paille
92*f764dc99Sserge-sans-paille // CHECK-LABEL: @babar2
babar2(foofoo2_t * f)93*f764dc99Sserge-sans-paille unsigned babar2(foofoo2_t *f) {
94*f764dc99Sserge-sans-paille // CHECK-STRICT-0: ret i32 16
95*f764dc99Sserge-sans-paille // CHECK-STRICT-1: ret i32 16
96*f764dc99Sserge-sans-paille // CHECK-STRICT-2: ret i32 16
97*f764dc99Sserge-sans-paille return OBJECT_SIZE_BUILTIN(f->c, 1);
98*f764dc99Sserge-sans-paille }
99