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