blob: a03bb0a8152727af21b1236e4e451ca0a8d6aaff [file] [log] [blame]
Richard Smith762bb9d2011-10-13 22:29:44 +00001// 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
Richard Smith4ac38092012-01-31 23:43:25 +00003// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR -DTEMPLATE %s | opt -instnamer -S | FileCheck %s
Richard Smith762bb9d2011-10-13 22:29:44 +00004// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR -DTEMPLATE %s | opt -instnamer -S | FileCheck %s
Richard Smith4ac38092012-01-31 23:43:25 +00005// 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
Richard Smithad762fc2011-04-14 22:09:26 +00007
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
Richard Smithf747ce62011-09-04 23:52:03 +000072#ifdef TEMPLATE
Richard Smith4ac38092012-01-31 23:43:25 +000073#ifdef DEPENDENT
Richard Smithf747ce62011-09-04 23:52:03 +000074template<typename D>
Richard Smith4ac38092012-01-31 23:43:25 +000075#else
76template<typename>
77#endif
Richard Smithf747ce62011-09-04 23:52:03 +000078#endif
Richard Smithad762fc2011-04-14 22:09:26 +000079void 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
Richard Smithf747ce62011-09-04 23:52:03 +000097#ifdef TEMPLATE
98template void for_temps<D>();
99#endif
100
101// CHECK: define {{.*}}for_temps
Richard Smithad762fc2011-04-14 22:09:26 +0000102// 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