Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR %s | opt -instnamer -S | FileCheck %s
      2 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR %s | opt -instnamer -S | FileCheck %s
      3 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR -DTEMPLATE %s | opt -instnamer -S | FileCheck %s
      4 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR -DTEMPLATE %s | opt -instnamer -S | FileCheck %s
      5 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR -DTEMPLATE -DDEPENDENT %s | opt -instnamer -S | FileCheck %s
      6 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR -DTEMPLATE -DDEPENDENT %s | opt -instnamer -S | FileCheck %s
      7 
      8 struct A {
      9   A();
     10   A(const A &);
     11   ~A();
     12 };
     13 
     14 struct B {
     15   B();
     16   B(const B &);
     17   ~B();
     18 };
     19 
     20 struct C {
     21   C(const B &);
     22   C(const C &);
     23   ~C();
     24 };
     25 
     26 struct E;
     27 struct D {
     28   D(const C &);
     29   D(const D &);
     30   ~D();
     31 };
     32 E begin(D);
     33 E end(D);
     34 
     35 struct F;
     36 struct G;
     37 struct H;
     38 struct E {
     39   E(const E &);
     40   ~E();
     41   F operator*();
     42   G operator++();
     43   H operator!=(const E &o);
     44 };
     45 
     46 struct I;
     47 struct F {
     48   F(const F &);
     49   ~F();
     50   operator I();
     51 };
     52 
     53 struct G {
     54   G(const G &);
     55   ~G();
     56   operator bool();
     57 };
     58 
     59 struct H {
     60   H(const H &);
     61   ~H();
     62   operator bool();
     63 };
     64 
     65 struct I {
     66   I(const I &);
     67   ~I();
     68 };
     69 
     70 void body(const I &);
     71 
     72 #ifdef TEMPLATE
     73 #ifdef DEPENDENT
     74 template<typename D>
     75 #else
     76 template<typename>
     77 #endif
     78 #endif
     79 void for_temps() {
     80   A a;
     81 #ifdef DESUGAR
     82   {
     83     auto && __range = D(B());
     84     for (auto __begin = begin(__range), __end = end(__range);
     85          __begin != __end; ++__begin) {
     86       I i = *__begin;
     87       body(i);
     88     }
     89   }
     90 #else
     91   for (I i : D(B())) {
     92     body(i);
     93   }
     94 #endif
     95 }
     96 
     97 #ifdef TEMPLATE
     98 template void for_temps<D>();
     99 #endif
    100 
    101 // CHECK: define {{.*}}for_temps
    102 // CHECK: call void @_ZN1AC1Ev(
    103 // CHECK: call void @_ZN1BC1Ev(
    104 // CHECK: call void @_ZN1CC1ERK1B(
    105 // CHECK: call void @_ZN1DC1ERK1C(
    106 // CHECK: call void @_ZN1CD1Ev(
    107 // CHECK: call void @_ZN1BD1Ev(
    108 // CHECK: call void @_ZN1DC1ERKS_(
    109 // CHECK: call void @_Z5begin1D(
    110 // CHECK: call void @_ZN1DD1Ev(
    111 // CHECK: call void @_ZN1DC1ERKS_(
    112 // CHECK: call void @_Z3end1D(
    113 // CHECK: call void @_ZN1DD1Ev(
    114 // CHECK: br label %[[COND:.*]]
    115 
    116 // CHECK: [[COND]]:
    117 // CHECK: call void @_ZN1EneERKS_(
    118 // CHECK: %[[CMP:.*]] = call zeroext i1 @_ZN1HcvbEv(
    119 // CHECK: call void @_ZN1HD1Ev(
    120 // CHECK: br i1 %[[CMP]], label %[[BODY:.*]], label %[[CLEANUP:.*]]
    121 
    122 // CHECK: [[CLEANUP]]:
    123 // CHECK: call void @_ZN1ED1Ev(
    124 // CHECK: call void @_ZN1ED1Ev(
    125 // In for-range:
    126 // call void @_ZN1DD1Ev(
    127 // CHECK: br label %[[END:.*]]
    128 
    129 // CHECK: [[BODY]]:
    130 // CHECK: call void @_ZN1EdeEv(
    131 // CHECK: call void @_ZN1Fcv1IEv(
    132 // CHECK: call void @_ZN1FD1Ev(
    133 // CHECK: call void @_Z4bodyRK1I(
    134 // CHECK: call void @_ZN1ID1Ev(
    135 // CHECK: br label %[[INC:.*]]
    136 
    137 // CHECK: [[INC]]:
    138 // CHECK: call void @_ZN1EppEv(
    139 // CHECK: call void @_ZN1GD1Ev(
    140 // CHECK: br label %[[COND]]
    141 
    142 // CHECK: [[END]]:
    143 // In desugared version:
    144 // call void @_ZN1DD1Ev(
    145 // CHECK: call void @_ZN1AD1Ev(
    146 // CHECK: ret void
    147