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