147 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR %s | FileCheck %s2// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR %s | FileCheck %s3// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR -DTEMPLATE %s | FileCheck %s4// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR -DTEMPLATE %s | FileCheck %s5// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR -DTEMPLATE -DDEPENDENT %s | FileCheck %s6// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR -DTEMPLATE -DDEPENDENT %s | FileCheck %s7 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 TEMPLATE73#ifdef DEPENDENT74template<typename D>75#else76template<typename>77#endif78#endif79void for_temps() {80 A a;81#ifdef DESUGAR82 {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#else91 for (I i : D(B())) {92 body(i);93 }94#endif95}96 97#ifdef TEMPLATE98template void for_temps<D>();99#endif100 101// CHECK: define {{.*}}for_temps102// 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 noundef 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 void147