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