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