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