// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -triple x86_64-apple-darwin -emit-llvm -o - %s | FileCheck %s // RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s | FileCheck %s #define PS(N) __attribute__((pass_object_size(N))) int ObjectSize0(void *const p PS(0)) { return __builtin_object_size(p, 0); } int ObjectSize1(void *const p PS(1)) { return __builtin_object_size(p, 1); } int ObjectSize2(void *const p PS(2)) { return __builtin_object_size(p, 2); } int ObjectSize3(void *const p PS(3)) { return __builtin_object_size(p, 3); } struct Foo { int t[10]; }; int gi; void test1(unsigned long sz) { struct Foo t[10]; // CHECK: call i32 @ObjectSize0(ptr noundef %{{.*}}, i64 noundef 360) gi = ObjectSize0(&t[1]); // call i32 @ObjectSize1(ptr noundef %{{.*}}, i64 noundef 360) // gi = ObjectSize2(&t[1]); // gi = ObjectSize2(&t[1].t[1]); } void foo2(struct Foo *t) { // CHECK: call i32 @ObjectSize3(ptr noundef %{{.*}}, i64 noundef 36) ObjectSize3(&t->t[1]); } /// Used to crash due to the void-typed ArraySubscriptExpr. void foo(void *p) { int i = __builtin_object_size(&p[2], 3); }