1af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s 2af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian// rdar: // 8353567 3af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian// pr7726 4af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian 5af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanianextern "C" int printf(...); 6af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian 756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallvoid test0() { 856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall// CHECK: call i32 (...)* @printf({{.*}}, i8* inttoptr (i64 3735928559 to i8*)) 9af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian printf("%p\n", (void *)0xdeadbeef ? : (void *)0xaaaaaa); 10af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian} 111fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahanian 121fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahanian// rdar://8446940 131fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahaniannamespace radar8446940 { 141fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahanianextern "C" void abort(); 151fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahanian 161fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahanianint main () { 171fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahanian char x[1]; 181fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahanian char *y = x ? : 0; 191fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahanian 201fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahanian if (x != y) 211fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahanian abort(); 221fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahanian} 231fb019bf42f5757c027edb56e5bb70233787a39cFariborz Jahanian} 24aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian 25aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahaniannamespace radar8453812 { 26aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanianextern "C" void abort(); 27aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian_Complex int getComplex(_Complex int val) { 28aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian static int count; 29aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian if (count++) 30aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian abort(); 31aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian return val; 32aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian} 33aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian 34aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian_Complex int cmplx() { 35aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian _Complex int cond; 36aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian _Complex int rhs; 37aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian 38aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian return getComplex(1+2i) ? : rhs; 39aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian} 40aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian 410b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian// lvalue test 420b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanianvoid foo (int& lv) { 430b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian ++lv; 440b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian} 450b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian 460b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanianint global = 1; 470b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian 480b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanianint &cond() { 490b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian static int count; 500b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian if (count++) 510b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian abort(); 520b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian return global; 530b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian} 540b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian 550b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian 56aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanianint main() { 57aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian cmplx(); 580b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian int rhs = 10; 590b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian foo (cond()? : rhs); 600b78710636671eeb2c5c4dedffa4ad1d58fa4bb8Fariborz Jahanian return global-2; 61aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian} 62aa3b57ee9e36a805371e2a543383225cdd2a5d83Fariborz Jahanian} 637cc25fe47290dc302157e15b04a1f95395f43ab5John McCall 647cc25fe47290dc302157e15b04a1f95395f43ab5John McCallnamespace test3 { 657cc25fe47290dc302157e15b04a1f95395f43ab5John McCall struct A { 667cc25fe47290dc302157e15b04a1f95395f43ab5John McCall A(); 677cc25fe47290dc302157e15b04a1f95395f43ab5John McCall A(const A&); 687cc25fe47290dc302157e15b04a1f95395f43ab5John McCall ~A(); 697cc25fe47290dc302157e15b04a1f95395f43ab5John McCall }; 707cc25fe47290dc302157e15b04a1f95395f43ab5John McCall 717cc25fe47290dc302157e15b04a1f95395f43ab5John McCall struct B { 727cc25fe47290dc302157e15b04a1f95395f43ab5John McCall B(); 737cc25fe47290dc302157e15b04a1f95395f43ab5John McCall B(const B&); 747cc25fe47290dc302157e15b04a1f95395f43ab5John McCall ~B(); 757cc25fe47290dc302157e15b04a1f95395f43ab5John McCall operator bool(); 767cc25fe47290dc302157e15b04a1f95395f43ab5John McCall operator A(); 777cc25fe47290dc302157e15b04a1f95395f43ab5John McCall }; 787cc25fe47290dc302157e15b04a1f95395f43ab5John McCall 797cc25fe47290dc302157e15b04a1f95395f43ab5John McCall B test0(B &x) { 8093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5test35test0ERNS_1BE( 817cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: [[X:%.*]] = alloca [[B:%.*]]*, 827cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]] 837cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: [[T0:%.*]] = load [[B]]** [[X]] 847cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]]) 857cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: br i1 [[BOOL]] 86ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: call void @_ZN5test31BC1ERKS0_([[B]]* [[RESULT:%.*]], [[B]]* nonnull [[T0]]) 877cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: br label 887cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: call void @_ZN5test31BC1Ev([[B]]* [[RESULT]]) 897cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: br label 907cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: ret void 917cc25fe47290dc302157e15b04a1f95395f43ab5John McCall return x ?: B(); 927cc25fe47290dc302157e15b04a1f95395f43ab5John McCall } 937cc25fe47290dc302157e15b04a1f95395f43ab5John McCall 947cc25fe47290dc302157e15b04a1f95395f43ab5John McCall B test1() { 9593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5test35test1Ev( 967cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: [[TEMP:%.*]] = alloca [[B]], 977cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: call void @_ZN5test312test1_helperEv([[B]]* sret [[TEMP]]) 987cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[TEMP]]) 997cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: br i1 [[BOOL]] 100ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: call void @_ZN5test31BC1ERKS0_([[B]]* [[RESULT:%.*]], [[B]]* nonnull [[TEMP]]) 1017cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: br label 1027cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: call void @_ZN5test31BC1Ev([[B]]* [[RESULT]]) 1037cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: br label 1047cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: call void @_ZN5test31BD1Ev([[B]]* [[TEMP]]) 1057cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: ret void 1067cc25fe47290dc302157e15b04a1f95395f43ab5John McCall extern B test1_helper(); 1077cc25fe47290dc302157e15b04a1f95395f43ab5John McCall return test1_helper() ?: B(); 1087cc25fe47290dc302157e15b04a1f95395f43ab5John McCall } 1097cc25fe47290dc302157e15b04a1f95395f43ab5John McCall 1107cc25fe47290dc302157e15b04a1f95395f43ab5John McCall 1117cc25fe47290dc302157e15b04a1f95395f43ab5John McCall A test2(B &x) { 11293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5test35test2ERNS_1BE( 1137cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: [[X:%.*]] = alloca [[B]]*, 1147cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]] 1157cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: [[T0:%.*]] = load [[B]]** [[X]] 1167cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]]) 1177cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: br i1 [[BOOL]] 1187cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: call void @_ZN5test31BcvNS_1AEEv([[A:%.*]]* sret [[RESULT:%.*]], [[B]]* [[T0]]) 1197cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: br label 1207cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: call void @_ZN5test31AC1Ev([[A]]* [[RESULT]]) 1217cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: br label 1227cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: ret void 1237cc25fe47290dc302157e15b04a1f95395f43ab5John McCall return x ?: A(); 1247cc25fe47290dc302157e15b04a1f95395f43ab5John McCall } 1257cc25fe47290dc302157e15b04a1f95395f43ab5John McCall 1267cc25fe47290dc302157e15b04a1f95395f43ab5John McCall A test3() { 12793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5test35test3Ev( 1287cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: [[TEMP:%.*]] = alloca [[B]], 1297cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: call void @_ZN5test312test3_helperEv([[B]]* sret [[TEMP]]) 1307cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[TEMP]]) 1317cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: br i1 [[BOOL]] 1327cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: call void @_ZN5test31BcvNS_1AEEv([[A]]* sret [[RESULT:%.*]], [[B]]* [[TEMP]]) 1337cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: br label 1347cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: call void @_ZN5test31AC1Ev([[A]]* [[RESULT]]) 1357cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: br label 1367cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK: call void @_ZN5test31BD1Ev([[B]]* [[TEMP]]) 1377cc25fe47290dc302157e15b04a1f95395f43ab5John McCall // CHECK-NEXT: ret void 1387cc25fe47290dc302157e15b04a1f95395f43ab5John McCall extern B test3_helper(); 1397cc25fe47290dc302157e15b04a1f95395f43ab5John McCall return test3_helper() ?: A(); 1407cc25fe47290dc302157e15b04a1f95395f43ab5John McCall } 1417cc25fe47290dc302157e15b04a1f95395f43ab5John McCall 1427cc25fe47290dc302157e15b04a1f95395f43ab5John McCall} 1432c0c745709c9f258f4c968bcf3e891faa9acbca6Eli Friedman 1442c0c745709c9f258f4c968bcf3e891faa9acbca6Eli Friedmannamespace test4 { 1452c0c745709c9f258f4c968bcf3e891faa9acbca6Eli Friedman // Make sure this doesn't crash. 1462c0c745709c9f258f4c968bcf3e891faa9acbca6Eli Friedman void f() { 1472c0c745709c9f258f4c968bcf3e891faa9acbca6Eli Friedman const int a = 10, b = 20; 1482c0c745709c9f258f4c968bcf3e891faa9acbca6Eli Friedman const int *c = &(a ?: b); 1492c0c745709c9f258f4c968bcf3e891faa9acbca6Eli Friedman } 1502c0c745709c9f258f4c968bcf3e891faa9acbca6Eli Friedman} 151