blob: be594ce5223d1272dfb06a27ed1261f72ae5c043 [file] [log] [blame]
Richard Smith3504faf2011-04-15 10:12:39 +00001// 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
Richard Smith02e85f32011-04-14 22:09:26 +00003
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