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