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 |
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 | |