// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s
// rdar: // 8353567
// pr7726

extern "C" int printf(...);

void test0() {
// CHECK: call i32 (...)* @printf({{.*}}, i8* inttoptr (i64 3735928559 to i8*))
    printf("%p\n", (void *)0xdeadbeef ? : (void *)0xaaaaaa);
}

// rdar://8446940
namespace radar8446940 {
extern "C" void abort();

int main () {
  char x[1];
  char *y = x ? : 0;

  if (x != y)
    abort();
}
}

namespace radar8453812 {
extern "C" void abort();
_Complex int getComplex(_Complex int val) {
  static int count;
  if (count++)
    abort();
  return val;
}

_Complex int cmplx() {
    _Complex int cond;
    _Complex int rhs;

    return getComplex(1+2i) ? : rhs;
}

// lvalue test
void foo (int& lv) {
  ++lv;
}

int global = 1;

int &cond() {
  static int count;
  if (count++)
    abort();
  return global;
}


int main() {
  cmplx();
  int rhs = 10;
  foo (cond()? : rhs);
  return  global-2;
}
}

namespace test3 {
  struct A {
    A();
    A(const A&);
    ~A();
  };

  struct B {
    B();
    B(const B&);
    ~B();
    operator bool();
    operator A();
  };

  B test0(B &x) {
    // CHECK-LABEL:    define void @_ZN5test35test0ERNS_1BE(
    // CHECK:      [[X:%.*]] = alloca [[B:%.*]]*,
    // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]]
    // CHECK-NEXT: [[T0:%.*]] = load [[B]]** [[X]]
    // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]])
    // CHECK-NEXT: br i1 [[BOOL]]
    // CHECK:      call void @_ZN5test31BC1ERKS0_([[B]]* [[RESULT:%.*]], [[B]]* dereferenceable({{[0-9]+}}) [[T0]])
    // CHECK-NEXT: br label
    // CHECK:      call void @_ZN5test31BC1Ev([[B]]* [[RESULT]])
    // CHECK-NEXT: br label
    // CHECK:      ret void
    return x ?: B();
  }

  B test1() {
    // CHECK-LABEL:    define void @_ZN5test35test1Ev(
    // CHECK:      [[TEMP:%.*]] = alloca [[B]],
    // CHECK-NEXT: call  void @_ZN5test312test1_helperEv([[B]]* sret [[TEMP]])
    // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[TEMP]])
    // CHECK-NEXT: br i1 [[BOOL]]
    // CHECK:      call void @_ZN5test31BC1ERKS0_([[B]]* [[RESULT:%.*]], [[B]]* dereferenceable({{[0-9]+}}) [[TEMP]])
    // CHECK-NEXT: br label
    // CHECK:      call void @_ZN5test31BC1Ev([[B]]* [[RESULT]])
    // CHECK-NEXT: br label
    // CHECK:      call void @_ZN5test31BD1Ev([[B]]* [[TEMP]])
    // CHECK-NEXT: ret void
    extern B test1_helper();
    return test1_helper() ?: B();
  }


  A test2(B &x) {
    // CHECK-LABEL:    define void @_ZN5test35test2ERNS_1BE(
    // CHECK:      [[X:%.*]] = alloca [[B]]*,
    // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]]
    // CHECK-NEXT: [[T0:%.*]] = load [[B]]** [[X]]
    // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]])
    // CHECK-NEXT: br i1 [[BOOL]]
    // CHECK:      call void @_ZN5test31BcvNS_1AEEv([[A:%.*]]* sret [[RESULT:%.*]], [[B]]* [[T0]])
    // CHECK-NEXT: br label
    // CHECK:      call void @_ZN5test31AC1Ev([[A]]* [[RESULT]])
    // CHECK-NEXT: br label
    // CHECK:      ret void
    return x ?: A();
  }

  A test3() {
    // CHECK-LABEL:    define void @_ZN5test35test3Ev(
    // CHECK:      [[TEMP:%.*]] = alloca [[B]],
    // CHECK-NEXT: call  void @_ZN5test312test3_helperEv([[B]]* sret [[TEMP]])
    // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[TEMP]])
    // CHECK-NEXT: br i1 [[BOOL]]
    // CHECK:      call void @_ZN5test31BcvNS_1AEEv([[A]]* sret [[RESULT:%.*]], [[B]]* [[TEMP]])
    // CHECK-NEXT: br label
    // CHECK:      call void @_ZN5test31AC1Ev([[A]]* [[RESULT]])
    // CHECK-NEXT: br label
    // CHECK:      call void @_ZN5test31BD1Ev([[B]]* [[TEMP]])
    // CHECK-NEXT: ret void
    extern B test3_helper();
    return test3_helper() ?: A();
  }

}

namespace test4 {
  // Make sure this doesn't crash.
  void f() {
    const int a = 10, b = 20;
    const int *c = &(a ?: b);
  }
}
