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