Home | History | Annotate | Download | only in CodeGenCXX
      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