blob: 9b15c6804dfc7b46529457fc556e0b2b8d0bec26 [file] [log] [blame]
John McCall7916c992012-08-01 05:04:58 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm %s -o - | FileCheck %s
Fariborz Jahanian93034ca2009-10-16 19:20:59 +00002
3struct A {
John McCall7916c992012-08-01 05:04:58 +00004 A(const A&);
5 A();
6 ~A();
Fariborz Jahanian93034ca2009-10-16 19:20:59 +00007};
8
9struct B : public A {
John McCall7916c992012-08-01 05:04:58 +000010 B();
11 B(const B& Other);
12 ~B();
Douglas Gregor2f599792010-04-02 18:24:57 +000013};
Fariborz Jahanian93034ca2009-10-16 19:20:59 +000014
15struct C : public B {
John McCall7916c992012-08-01 05:04:58 +000016 C();
17 C(const C& Other);
18 ~C();
Fariborz Jahanian93034ca2009-10-16 19:20:59 +000019};
20
21struct X {
John McCall7916c992012-08-01 05:04:58 +000022 operator B&();
23 operator C&();
24 X(const X&);
25 X();
26 ~X();
27 B b;
28 C c;
Fariborz Jahanian93034ca2009-10-16 19:20:59 +000029};
30
John McCall7916c992012-08-01 05:04:58 +000031void test0_helper(A);
32void test0(X x) {
33 test0_helper(x);
34 // CHECK: define void @_Z5test01X(
35 // CHECK: [[TMP:%.*]] = alloca [[A:%.*]], align
36 // CHECK-NEXT: [[T0:%.*]] = call [[B:%.*]]* @_ZN1XcvR1BEv(
37 // CHECK-NEXT: [[T1:%.*]] = bitcast [[B]]* [[T0]] to [[A]]*
38 // CHECK-NEXT: call void @_ZN1AC1ERKS_([[A]]* [[TMP]], [[A]]* [[T1]])
39 // CHECK-NEXT: call void @_Z12test0_helper1A([[A]]* [[TMP]])
40 // CHECK-NEXT: call void @_ZN1AD1Ev([[A]]* [[TMP]])
41 // CHECK-NEXT: ret void
Fariborz Jahanian93034ca2009-10-16 19:20:59 +000042}
43
Fariborz Jahanian3759a032009-10-19 19:18:20 +000044struct Base;
45
46struct Root {
John McCall7916c992012-08-01 05:04:58 +000047 operator Base&();
Fariborz Jahanian3759a032009-10-19 19:18:20 +000048};
49
50struct Derived;
51
52struct Base : Root {
John McCall7916c992012-08-01 05:04:58 +000053 Base(const Base &);
54 Base();
55 operator Derived &();
Fariborz Jahanian3759a032009-10-19 19:18:20 +000056};
57
58struct Derived : Base {
59};
60
John McCall7916c992012-08-01 05:04:58 +000061void test1_helper(Base);
62void test1(Derived bb) {
63 // CHECK: define void @_Z5test17Derived(
64 // CHECK-NOT: call {{.*}} @_ZN4BasecvR7DerivedEv(
65 // CHECK: call void @_ZN4BaseC1ERKS_(
66 // CHECK-NOT: call {{.*}} @_ZN4BasecvR7DerivedEv(
67 // CHECK: call void @_Z12test1_helper4Base(
68 test1_helper(bb);
Fariborz Jahanian3759a032009-10-19 19:18:20 +000069}
Fariborz Jahanian93034ca2009-10-16 19:20:59 +000070
John McCall7916c992012-08-01 05:04:58 +000071// Don't crash after devirtualizing a derived-to-base conversion
72// to an empty base allocated at offset zero.
73// rdar://problem/11993704
74class Test2a {};
75class Test2b final : public virtual Test2a {};
76void test2(Test2b &x) {
77 Test2a &y = x;
78 // CHECK: define void @_Z5test2R6Test2b(
79 // CHECK: [[X:%.*]] = alloca [[B:%.*]]*, align 8
80 // CHECK-NEXT: [[Y:%.*]] = alloca [[A:%.*]]*, align 8
81 // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]], align 8
82 // CHECK-NEXT: [[T0:%.*]] = load [[B]]** [[X]], align 8
83 // CHECK-NEXT: [[T1:%.*]] = bitcast [[B]]* [[T0]] to [[A]]*
84 // CHECK-NEXT: store [[A]]* [[T1]], [[A]]** [[Y]], align 8
85 // CHECK-NEXT: ret void
86}