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