// RUN: %clang_cc1 -disable-noundef-analysis           -triple x86_64-apple-darwin -emit-llvm %s -o - 2>&1 | FileCheck %s
// RUN: %clang_cc1 -disable-noundef-analysis -DDYNAMIC -triple x86_64-apple-darwin -emit-llvm %s -o - 2>&1 | FileCheck %s

#ifndef DYNAMIC
#define OBJECT_SIZE_BUILTIN __builtin_object_size
#else
#define OBJECT_SIZE_BUILTIN __builtin_dynamic_object_size
#endif

#define strcpy(dest, src) \
  ((OBJECT_SIZE_BUILTIN(dest, 0) != -1ULL) \
   ? __builtin___strcpy_chk (dest, src, OBJECT_SIZE_BUILTIN(dest, 1)) \
   : __inline_strcpy_chk(dest, src))

static char *__inline_strcpy_chk (char *dest, const char *src) {
  return __builtin___strcpy_chk(dest, src, OBJECT_SIZE_BUILTIN(dest, 1));
}

char gbuf[63];
char *gp;
int gi, gj;

// CHECK-LABEL: define{{.*}} void @test1
void test1() {
  // CHECK:     = call i8* @__strcpy_chk(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @gbuf, i64 0, i64 4), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0), i64 59)
  strcpy(&gbuf[4], "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test2
void test2() {
  // CHECK:     = call i8* @__strcpy_chk(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @gbuf, i64 0, i64 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0), i64 63)
  strcpy(gbuf, "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test3
void test3() {
  // CHECK:     = call i8* @__strcpy_chk(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @gbuf, i64 1, i64 37), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0), i64 0)
  strcpy(&gbuf[100], "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test4
void test4() {
  // CHECK:     = call i8* @__strcpy_chk(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @gbuf, i64 0, i64 -1), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0), i64 0)
  strcpy((char*)(void*)&gbuf[-1], "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test5
void test5() {
  // CHECK:     = load i8*, i8** @gp
  // CHECK-NEXT:= call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  strcpy(gp, "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test6
void test6() {
  char buf[57];

  // CHECK:       = call i8* @__strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0), i64 53)
  strcpy(&buf[4], "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test7
void test7() {
  int i;
  // Ensure we only evaluate the side-effect once.
  // CHECK:     = add
  // CHECK-NOT: = add
  // CHECK:     = call i8* @__strcpy_chk(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @gbuf, i64 0, i64 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0), i64 63)
  strcpy((++i, gbuf), "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test8
void test8() {
  char *buf[50];
  // CHECK-NOT:   __strcpy_chk
  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
  strcpy(buf[++gi], "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test9
void test9() {
  // CHECK-NOT:   __strcpy_chk
  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
  strcpy((char *)((++gi) + gj), "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test10
char **p;
void test10() {
  // CHECK-NOT:   __strcpy_chk
  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
  strcpy(*(++p), "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test11
void test11() {
  // CHECK-NOT:   __strcpy_chk
  // CHECK:       = call i8* @__inline_strcpy_chk(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @gbuf, i64 0, i64 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
  strcpy(gp = gbuf, "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test12
void test12() {
  // CHECK-NOT:   __strcpy_chk
  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
  strcpy(++gp, "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test13
void test13() {
  // CHECK-NOT:   __strcpy_chk
  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
  strcpy(gp++, "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test14
void test14() {
  // CHECK-NOT:   __strcpy_chk
  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
  strcpy(--gp, "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test15
void test15() {
  // CHECK-NOT:   __strcpy_chk
  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{..*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
  strcpy(gp--, "Hi there");
}

// CHECK-LABEL: define{{.*}} void @test16
void test16() {
  // CHECK-NOT:   __strcpy_chk
  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
  strcpy(gp += 1, "Hi there");
}

// CHECK-LABEL: @test17
void test17() {
  // CHECK: store i32 -1
  gi = OBJECT_SIZE_BUILTIN(gp++, 0);
  // CHECK: store i32 -1
  gi = OBJECT_SIZE_BUILTIN(gp++, 1);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(gp++, 2);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(gp++, 3);
}

// CHECK-LABEL: @test18
unsigned test18(int cond) {
  int a[4], b[4];
  // CHECK: phi i32*
  // CHECK: call i64 @llvm.objectsize.i64
  return OBJECT_SIZE_BUILTIN(cond ? a : b, 0);
}

// CHECK-LABEL: @test19
void test19() {
  struct {
    int a, b;
  } foo;

  // CHECK: store i32 8
  gi = OBJECT_SIZE_BUILTIN(&foo.a, 0);
  // CHECK: store i32 4
  gi = OBJECT_SIZE_BUILTIN(&foo.a, 1);
  // CHECK: store i32 8
  gi = OBJECT_SIZE_BUILTIN(&foo.a, 2);
  // CHECK: store i32 4
  gi = OBJECT_SIZE_BUILTIN(&foo.a, 3);

  // CHECK: store i32 4
  gi = OBJECT_SIZE_BUILTIN(&foo.b, 0);
  // CHECK: store i32 4
  gi = OBJECT_SIZE_BUILTIN(&foo.b, 1);
  // CHECK: store i32 4
  gi = OBJECT_SIZE_BUILTIN(&foo.b, 2);
  // CHECK: store i32 4
  gi = OBJECT_SIZE_BUILTIN(&foo.b, 3);
}

// CHECK-LABEL: @test20
void test20() {
  struct { int t[10]; } t[10];

  // CHECK: store i32 380
  gi = OBJECT_SIZE_BUILTIN(&t[0].t[5], 0);
  // CHECK: store i32 20
  gi = OBJECT_SIZE_BUILTIN(&t[0].t[5], 1);
  // CHECK: store i32 380
  gi = OBJECT_SIZE_BUILTIN(&t[0].t[5], 2);
  // CHECK: store i32 20
  gi = OBJECT_SIZE_BUILTIN(&t[0].t[5], 3);
}

// CHECK-LABEL: @test21
void test21() {
  struct { int t; } t;

  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t + 1, 0);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t + 1, 1);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t + 1, 2);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t + 1, 3);

  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t.t + 1, 0);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t.t + 1, 1);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t.t + 1, 2);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t.t + 1, 3);
}

// CHECK-LABEL: @test22
void test22() {
  struct { int t[10]; } t[10];

  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t[10], 0);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t[10], 1);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t[10], 2);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t[10], 3);

  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t[9].t[10], 0);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t[9].t[10], 1);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t[9].t[10], 2);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t[9].t[10], 3);

  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN((char*)&t[0] + sizeof(t), 0);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN((char*)&t[0] + sizeof(t), 1);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN((char*)&t[0] + sizeof(t), 2);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN((char*)&t[0] + sizeof(t), 3);

  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN((char*)&t[9].t[0] + 10*sizeof(t[0].t), 0);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN((char*)&t[9].t[0] + 10*sizeof(t[0].t), 1);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN((char*)&t[9].t[0] + 10*sizeof(t[0].t), 2);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN((char*)&t[9].t[0] + 10*sizeof(t[0].t), 3);
}

struct Test23Ty { int a; int t[10]; };

// CHECK-LABEL: @test23
void test23(struct Test23Ty *p) {
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(p, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(p, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(p, 2);
  // Note: this is currently fixed at 0 because LLVM doesn't have sufficient
  // data to correctly handle type=3
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(p, 3);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(&p->a, 0);
  // CHECK: store i32 4
  gi = OBJECT_SIZE_BUILTIN(&p->a, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(&p->a, 2);
  // CHECK: store i32 4
  gi = OBJECT_SIZE_BUILTIN(&p->a, 3);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(&p->t[5], 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(&p->t[5], 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(&p->t[5], 2);
  // CHECK: store i32 20
  gi = OBJECT_SIZE_BUILTIN(&p->t[5], 3);
}

// PR24493 -- ICE if OBJECT_SIZE_BUILTIN called with NULL and (Type & 1) != 0
// CHECK-LABEL: @test24
void test24() {
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN((void*)0, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN((void*)0, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN((void*)0, 2);
  // Note: Currently fixed at zero because LLVM can't handle type=3 correctly.
  // Hopefully will be lowered properly in the future.
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN((void*)0, 3);
}

// CHECK-LABEL: @test25
void test25() {
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN((void*)0x1000, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN((void*)0x1000, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN((void*)0x1000, 2);
  // Note: Currently fixed at zero because LLVM can't handle type=3 correctly.
  // Hopefully will be lowered properly in the future.
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN((void*)0x1000, 3);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN((void*)0 + 0x1000, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN((void*)0 + 0x1000, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN((void*)0 + 0x1000, 2);
  // Note: Currently fixed at zero because LLVM can't handle type=3 correctly.
  // Hopefully will be lowered properly in the future.
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN((void*)0 + 0x1000, 3);
}

// CHECK-LABEL: @test26
void test26() {
  struct { int v[10]; } t[10];

  // CHECK: store i32 316
  gi = OBJECT_SIZE_BUILTIN(&t[1].v[11], 0);
  // CHECK: store i32 312
  gi = OBJECT_SIZE_BUILTIN(&t[1].v[12], 1);
  // CHECK: store i32 308
  gi = OBJECT_SIZE_BUILTIN(&t[1].v[13], 2);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&t[1].v[14], 3);
}

struct Test27IncompleteTy;

// CHECK-LABEL: @test27
void test27(struct Test27IncompleteTy *t) {
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(t, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(t, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(t, 2);
  // Note: this is currently fixed at 0 because LLVM doesn't have sufficient
  // data to correctly handle type=3
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(t, 3);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(&test27, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(&test27, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(&test27, 2);
  // Note: this is currently fixed at 0 because LLVM doesn't have sufficient
  // data to correctly handle type=3
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(&test27, 3);
}

// The intent of this test is to ensure that OBJECT_SIZE_BUILTIN treats `&foo`
// and `(T*)&foo` identically, when used as the pointer argument.
// CHECK-LABEL: @test28
void test28() {
  struct { int v[10]; } t[10];

#define addCasts(s) ((char*)((short*)(s)))
  // CHECK: store i32 360
  gi = OBJECT_SIZE_BUILTIN(addCasts(&t[1]), 0);
  // CHECK: store i32 360
  gi = OBJECT_SIZE_BUILTIN(addCasts(&t[1]), 1);
  // CHECK: store i32 360
  gi = OBJECT_SIZE_BUILTIN(addCasts(&t[1]), 2);
  // CHECK: store i32 360
  gi = OBJECT_SIZE_BUILTIN(addCasts(&t[1]), 3);

  // CHECK: store i32 356
  gi = OBJECT_SIZE_BUILTIN(addCasts(&t[1].v[1]), 0);
  // CHECK: store i32 36
  gi = OBJECT_SIZE_BUILTIN(addCasts(&t[1].v[1]), 1);
  // CHECK: store i32 356
  gi = OBJECT_SIZE_BUILTIN(addCasts(&t[1].v[1]), 2);
  // CHECK: store i32 36
  gi = OBJECT_SIZE_BUILTIN(addCasts(&t[1].v[1]), 3);
#undef addCasts
}

struct DynStructVar {
  char fst[16];
  char snd[];
};

struct DynStruct0 {
  char fst[16];
  char snd[0];
};

struct DynStruct1 {
  char fst[16];
  char snd[1];
};

struct StaticStruct {
  char fst[16];
  char snd[2];
};

// CHECK-LABEL: @test29
void test29(struct DynStructVar *dv, struct DynStruct0 *d0,
            struct DynStruct1 *d1, struct StaticStruct *ss) {
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(dv->snd, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(dv->snd, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(dv->snd, 2);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(dv->snd, 3);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(d0->snd, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(d0->snd, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(d0->snd, 2);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(d0->snd, 3);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(d1->snd, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(d1->snd, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(d1->snd, 2);
  // CHECK: store i32 1
  gi = OBJECT_SIZE_BUILTIN(d1->snd, 3);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(ss->snd, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(ss->snd, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(ss->snd, 2);
  // CHECK: store i32 2
  gi = OBJECT_SIZE_BUILTIN(ss->snd, 3);
}

// CHECK-LABEL: @test30
void test30() {
  struct { struct DynStruct1 fst, snd; } *nested;

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(nested->fst.snd, 0);
  // CHECK: store i32 1
  gi = OBJECT_SIZE_BUILTIN(nested->fst.snd, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(nested->fst.snd, 2);
  // CHECK: store i32 1
  gi = OBJECT_SIZE_BUILTIN(nested->fst.snd, 3);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(nested->snd.snd, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(nested->snd.snd, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(nested->snd.snd, 2);
  // CHECK: store i32 1
  gi = OBJECT_SIZE_BUILTIN(nested->snd.snd, 3);

  union { struct DynStruct1 d1; char c[1]; } *u;
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(u->c, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(u->c, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(u->c, 2);
  // CHECK: store i32 1
  gi = OBJECT_SIZE_BUILTIN(u->c, 3);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(u->d1.snd, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(u->d1.snd, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(u->d1.snd, 2);
  // CHECK: store i32 1
  gi = OBJECT_SIZE_BUILTIN(u->d1.snd, 3);
}

// CHECK-LABEL: @test31
void test31() {
  // Miscellaneous 'writing off the end' detection tests
  struct DynStructVar *dsv;
  struct DynStruct0 *ds0;
  struct DynStruct1 *ds1;
  struct StaticStruct *ss;

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(ds1[9].snd, 1);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(&ss[9].snd[0], 1);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(&ds1[9].snd[0], 1);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(&ds0[9].snd[0], 1);

  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(&dsv[9].snd[0], 1);
}

// CHECK-LABEL: @PR30346
void PR30346() {
  struct sa_family_t {};
  struct sockaddr {
    struct sa_family_t sa_family;
    char sa_data[14];
  };

  struct sockaddr *sa;
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(sa->sa_data, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(sa->sa_data, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1
  gi = OBJECT_SIZE_BUILTIN(sa->sa_data, 2);
  // CHECK: store i32 14
  gi = OBJECT_SIZE_BUILTIN(sa->sa_data, 3);
}

extern char incomplete_char_array[];
// CHECK-LABEL: @incomplete_and_function_types
int incomplete_and_function_types() {
  // CHECK: call i64 @llvm.objectsize.i64.p0i8
  gi = OBJECT_SIZE_BUILTIN(incomplete_char_array, 0);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8
  gi = OBJECT_SIZE_BUILTIN(incomplete_char_array, 1);
  // CHECK: call i64 @llvm.objectsize.i64.p0i8
  gi = OBJECT_SIZE_BUILTIN(incomplete_char_array, 2);
  // CHECK: store i32 0
  gi = OBJECT_SIZE_BUILTIN(incomplete_char_array, 3);
}

// Flips between the pointer and lvalue evaluator a lot.
void deeply_nested() {
  struct {
    struct {
      struct {
        struct {
          int e[2];
          char f; // Inhibit our writing-off-the-end check
        } d[2];
      } c[2];
    } b[2];
  } *a;

  // CHECK: store i32 4
  gi = OBJECT_SIZE_BUILTIN(&a->b[1].c[1].d[1].e[1], 1);
  // CHECK: store i32 4
  gi = OBJECT_SIZE_BUILTIN(&a->b[1].c[1].d[1].e[1], 3);
}
