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 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 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 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 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 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 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 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