1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li // C++-specific tests for __builtin_object_size
4*67e74705SXin Li
5*67e74705SXin Li int gi;
6*67e74705SXin Li
7*67e74705SXin Li // CHECK-LABEL: define void @_Z5test1v()
test1()8*67e74705SXin Li void test1() {
9*67e74705SXin Li // Guaranteeing that our cast removal logic doesn't break more interesting
10*67e74705SXin Li // cases.
11*67e74705SXin Li struct A { int a; };
12*67e74705SXin Li struct B { int b; };
13*67e74705SXin Li struct C: public A, public B {};
14*67e74705SXin Li
15*67e74705SXin Li C c;
16*67e74705SXin Li
17*67e74705SXin Li // CHECK: store i32 8
18*67e74705SXin Li gi = __builtin_object_size(&c, 0);
19*67e74705SXin Li // CHECK: store i32 8
20*67e74705SXin Li gi = __builtin_object_size((A*)&c, 0);
21*67e74705SXin Li // CHECK: store i32 4
22*67e74705SXin Li gi = __builtin_object_size((B*)&c, 0);
23*67e74705SXin Li
24*67e74705SXin Li // CHECK: store i32 8
25*67e74705SXin Li gi = __builtin_object_size((char*)&c, 0);
26*67e74705SXin Li // CHECK: store i32 8
27*67e74705SXin Li gi = __builtin_object_size((char*)(A*)&c, 0);
28*67e74705SXin Li // CHECK: store i32 4
29*67e74705SXin Li gi = __builtin_object_size((char*)(B*)&c, 0);
30*67e74705SXin Li }
31*67e74705SXin Li
32*67e74705SXin Li // CHECK-LABEL: define void @_Z5test2v()
test2()33*67e74705SXin Li void test2() {
34*67e74705SXin Li struct A { char buf[16]; };
35*67e74705SXin Li struct B : A {};
36*67e74705SXin Li struct C { int i; B bs[1]; } *c;
37*67e74705SXin Li
38*67e74705SXin Li // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
39*67e74705SXin Li gi = __builtin_object_size(&c->bs[0], 0);
40*67e74705SXin Li // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
41*67e74705SXin Li gi = __builtin_object_size(&c->bs[0], 1);
42*67e74705SXin Li // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
43*67e74705SXin Li gi = __builtin_object_size(&c->bs[0], 2);
44*67e74705SXin Li // CHECK: store i32 16
45*67e74705SXin Li gi = __builtin_object_size(&c->bs[0], 3);
46*67e74705SXin Li
47*67e74705SXin Li // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
48*67e74705SXin Li gi = __builtin_object_size((A*)&c->bs[0], 0);
49*67e74705SXin Li // CHECK: store i32 16
50*67e74705SXin Li gi = __builtin_object_size((A*)&c->bs[0], 1);
51*67e74705SXin Li // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
52*67e74705SXin Li gi = __builtin_object_size((A*)&c->bs[0], 2);
53*67e74705SXin Li // CHECK: store i32 16
54*67e74705SXin Li gi = __builtin_object_size((A*)&c->bs[0], 3);
55*67e74705SXin Li
56*67e74705SXin Li // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
57*67e74705SXin Li gi = __builtin_object_size(&c->bs[0].buf[0], 0);
58*67e74705SXin Li // CHECK: store i32 16
59*67e74705SXin Li gi = __builtin_object_size(&c->bs[0].buf[0], 1);
60*67e74705SXin Li // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
61*67e74705SXin Li gi = __builtin_object_size(&c->bs[0].buf[0], 2);
62*67e74705SXin Li // CHECK: store i32 16
63*67e74705SXin Li gi = __builtin_object_size(&c->bs[0].buf[0], 3);
64*67e74705SXin Li }
65