1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li // rdar: // 8353567
3*67e74705SXin Li // pr7726
4*67e74705SXin Li
5*67e74705SXin Li extern "C" int printf(...);
6*67e74705SXin Li
test0()7*67e74705SXin Li void test0() {
8*67e74705SXin Li // CHECK: call i32 (...) @printf({{.*}}, i8* inttoptr (i64 3735928559 to i8*))
9*67e74705SXin Li printf("%p\n", (void *)0xdeadbeef ? : (void *)0xaaaaaa);
10*67e74705SXin Li }
11*67e74705SXin Li
12*67e74705SXin Li // rdar://8446940
13*67e74705SXin Li namespace radar8446940 {
14*67e74705SXin Li extern "C" void abort();
15*67e74705SXin Li
main()16*67e74705SXin Li int main () {
17*67e74705SXin Li char x[1];
18*67e74705SXin Li char *y = x ? : 0;
19*67e74705SXin Li
20*67e74705SXin Li if (x != y)
21*67e74705SXin Li abort();
22*67e74705SXin Li }
23*67e74705SXin Li }
24*67e74705SXin Li
25*67e74705SXin Li namespace radar8453812 {
26*67e74705SXin Li extern "C" void abort();
getComplex(_Complex int val)27*67e74705SXin Li _Complex int getComplex(_Complex int val) {
28*67e74705SXin Li static int count;
29*67e74705SXin Li if (count++)
30*67e74705SXin Li abort();
31*67e74705SXin Li return val;
32*67e74705SXin Li }
33*67e74705SXin Li
cmplx()34*67e74705SXin Li _Complex int cmplx() {
35*67e74705SXin Li _Complex int cond;
36*67e74705SXin Li _Complex int rhs;
37*67e74705SXin Li
38*67e74705SXin Li return getComplex(1+2i) ? : rhs;
39*67e74705SXin Li }
40*67e74705SXin Li
41*67e74705SXin Li // lvalue test
foo(int & lv)42*67e74705SXin Li void foo (int& lv) {
43*67e74705SXin Li ++lv;
44*67e74705SXin Li }
45*67e74705SXin Li
46*67e74705SXin Li int global = 1;
47*67e74705SXin Li
cond()48*67e74705SXin Li int &cond() {
49*67e74705SXin Li static int count;
50*67e74705SXin Li if (count++)
51*67e74705SXin Li abort();
52*67e74705SXin Li return global;
53*67e74705SXin Li }
54*67e74705SXin Li
55*67e74705SXin Li
main()56*67e74705SXin Li int main() {
57*67e74705SXin Li cmplx();
58*67e74705SXin Li int rhs = 10;
59*67e74705SXin Li foo (cond()? : rhs);
60*67e74705SXin Li return global-2;
61*67e74705SXin Li }
62*67e74705SXin Li }
63*67e74705SXin Li
64*67e74705SXin Li namespace test3 {
65*67e74705SXin Li struct A {
66*67e74705SXin Li A();
67*67e74705SXin Li A(const A&);
68*67e74705SXin Li ~A();
69*67e74705SXin Li };
70*67e74705SXin Li
71*67e74705SXin Li struct B {
72*67e74705SXin Li B();
73*67e74705SXin Li B(const B&);
74*67e74705SXin Li ~B();
75*67e74705SXin Li operator bool();
76*67e74705SXin Li operator A();
77*67e74705SXin Li };
78*67e74705SXin Li
test0(B & x)79*67e74705SXin Li B test0(B &x) {
80*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test35test0ERNS_1BE(
81*67e74705SXin Li // CHECK: [[X:%.*]] = alloca [[B:%.*]]*,
82*67e74705SXin Li // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]]
83*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = load [[B]]*, [[B]]** [[X]]
84*67e74705SXin Li // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]])
85*67e74705SXin Li // CHECK-NEXT: br i1 [[BOOL]]
86*67e74705SXin Li // CHECK: call void @_ZN5test31BC1ERKS0_([[B]]* [[RESULT:%.*]], [[B]]* dereferenceable({{[0-9]+}}) [[T0]])
87*67e74705SXin Li // CHECK-NEXT: br label
88*67e74705SXin Li // CHECK: call void @_ZN5test31BC1Ev([[B]]* [[RESULT]])
89*67e74705SXin Li // CHECK-NEXT: br label
90*67e74705SXin Li // CHECK: ret void
91*67e74705SXin Li return x ?: B();
92*67e74705SXin Li }
93*67e74705SXin Li
test1()94*67e74705SXin Li B test1() {
95*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test35test1Ev(
96*67e74705SXin Li // CHECK: [[TEMP:%.*]] = alloca [[B]],
97*67e74705SXin Li // CHECK-NEXT: call void @_ZN5test312test1_helperEv([[B]]* sret [[TEMP]])
98*67e74705SXin Li // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[TEMP]])
99*67e74705SXin Li // CHECK-NEXT: br i1 [[BOOL]]
100*67e74705SXin Li // CHECK: call void @_ZN5test31BC1ERKS0_([[B]]* [[RESULT:%.*]], [[B]]* dereferenceable({{[0-9]+}}) [[TEMP]])
101*67e74705SXin Li // CHECK-NEXT: br label
102*67e74705SXin Li // CHECK: call void @_ZN5test31BC1Ev([[B]]* [[RESULT]])
103*67e74705SXin Li // CHECK-NEXT: br label
104*67e74705SXin Li // CHECK: call void @_ZN5test31BD1Ev([[B]]* [[TEMP]])
105*67e74705SXin Li // CHECK-NEXT: ret void
106*67e74705SXin Li extern B test1_helper();
107*67e74705SXin Li return test1_helper() ?: B();
108*67e74705SXin Li }
109*67e74705SXin Li
110*67e74705SXin Li
test2(B & x)111*67e74705SXin Li A test2(B &x) {
112*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test35test2ERNS_1BE(
113*67e74705SXin Li // CHECK: [[X:%.*]] = alloca [[B]]*,
114*67e74705SXin Li // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]]
115*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = load [[B]]*, [[B]]** [[X]]
116*67e74705SXin Li // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]])
117*67e74705SXin Li // CHECK-NEXT: br i1 [[BOOL]]
118*67e74705SXin Li // CHECK: call void @_ZN5test31BcvNS_1AEEv([[A:%.*]]* sret [[RESULT:%.*]], [[B]]* [[T0]])
119*67e74705SXin Li // CHECK-NEXT: br label
120*67e74705SXin Li // CHECK: call void @_ZN5test31AC1Ev([[A]]* [[RESULT]])
121*67e74705SXin Li // CHECK-NEXT: br label
122*67e74705SXin Li // CHECK: ret void
123*67e74705SXin Li return x ?: A();
124*67e74705SXin Li }
125*67e74705SXin Li
test3()126*67e74705SXin Li A test3() {
127*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test35test3Ev(
128*67e74705SXin Li // CHECK: [[TEMP:%.*]] = alloca [[B]],
129*67e74705SXin Li // CHECK-NEXT: call void @_ZN5test312test3_helperEv([[B]]* sret [[TEMP]])
130*67e74705SXin Li // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[TEMP]])
131*67e74705SXin Li // CHECK-NEXT: br i1 [[BOOL]]
132*67e74705SXin Li // CHECK: call void @_ZN5test31BcvNS_1AEEv([[A]]* sret [[RESULT:%.*]], [[B]]* [[TEMP]])
133*67e74705SXin Li // CHECK-NEXT: br label
134*67e74705SXin Li // CHECK: call void @_ZN5test31AC1Ev([[A]]* [[RESULT]])
135*67e74705SXin Li // CHECK-NEXT: br label
136*67e74705SXin Li // CHECK: call void @_ZN5test31BD1Ev([[B]]* [[TEMP]])
137*67e74705SXin Li // CHECK-NEXT: ret void
138*67e74705SXin Li extern B test3_helper();
139*67e74705SXin Li return test3_helper() ?: A();
140*67e74705SXin Li }
141*67e74705SXin Li
142*67e74705SXin Li }
143*67e74705SXin Li
144*67e74705SXin Li namespace test4 {
145*67e74705SXin Li // Make sure this doesn't crash.
f()146*67e74705SXin Li void f() {
147*67e74705SXin Li const int a = 10, b = 20;
148*67e74705SXin Li const int *c = &(a ?: b);
149*67e74705SXin Li }
150*67e74705SXin Li }
151