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