1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++0x -emit-llvm -o - -UDESUGAR %s | opt -instnamer -S | FileCheck %s
2 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++0x -emit-llvm -o - -DDESUGAR %s | opt -instnamer -S | FileCheck %s
3
4 struct A {
5 A();
6 A(const A &);
7 ~A();
8 };
9
10 struct B {
11 B();
12 B(const B &);
13 ~B();
14 };
15
16 struct C {
17 C(const B &);
18 C(const C &);
19 ~C();
20 };
21
22 struct E;
23 struct D {
24 D(const C &);
25 D(const D &);
26 ~D();
27 };
28 E begin(D);
29 E end(D);
30
31 struct F;
32 struct G;
33 struct H;
34 struct E {
35 E(const E &);
36 ~E();
37 F operator*();
38 G operator++();
39 H operator!=(const E &o);
40 };
41
42 struct I;
43 struct F {
44 F(const F &);
45 ~F();
46 operator I();
47 };
48
49 struct G {
50 G(const G &);
51 ~G();
52 operator bool();
53 };
54
55 struct H {
56 H(const H &);
57 ~H();
58 operator bool();
59 };
60
61 struct I {
62 I(const I &);
63 ~I();
64 };
65
66 void body(const I &);
67
for_temps()68 void 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