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 8struct A { 9 A(); 10 A(const A &); 11 ~A(); 12}; 13 14struct B { 15 B(); 16 B(const B &); 17 ~B(); 18}; 19 20struct C { 21 C(const B &); 22 C(const C &); 23 ~C(); 24}; 25 26struct E; 27struct D { 28 D(const C &); 29 D(const D &); 30 ~D(); 31}; 32E begin(D); 33E end(D); 34 35struct F; 36struct G; 37struct H; 38struct E { 39 E(const E &); 40 ~E(); 41 F operator*(); 42 G operator++(); 43 H operator!=(const E &o); 44}; 45 46struct I; 47struct F { 48 F(const F &); 49 ~F(); 50 operator I(); 51}; 52 53struct G { 54 G(const G &); 55 ~G(); 56 operator bool(); 57}; 58 59struct H { 60 H(const H &); 61 ~H(); 62 operator bool(); 63}; 64 65struct I { 66 I(const I &); 67 ~I(); 68}; 69 70void body(const I &); 71 72#ifdef TEMPLATE 73#ifdef DEPENDENT 74template<typename D> 75#else 76template<typename> 77#endif 78#endif 79void 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 98template 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