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