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