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