123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- // 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]]*, [[B]]** [[X]]
- // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]])
- // CHECK-NEXT: br i1 [[BOOL]]
- // CHECK: call void @_ZN5test31BC1ERKS0_([[B]]* noalias [[RESULT:%.*]], [[B]]* dereferenceable({{[0-9]+}}) [[T0]])
- // CHECK-NEXT: br label
- // CHECK: call void @_ZN5test31BC1Ev([[B]]* noalias [[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]]* noalias [[RESULT:%.*]], [[B]]* dereferenceable({{[0-9]+}}) [[TEMP]])
- // CHECK-NEXT: br label
- // CHECK: call void @_ZN5test31BC1Ev([[B]]* noalias [[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]]*, [[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]]* noalias [[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]]* noalias [[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);
- }
- }
|