xref: /aosp_15_r20/external/clang/test/CodeGenCXX/for-range-temporaries.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR %s | opt -instnamer -S | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR %s | opt -instnamer -S | FileCheck %s
3*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR -DTEMPLATE %s | opt -instnamer -S | FileCheck %s
4*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR -DTEMPLATE %s | opt -instnamer -S | FileCheck %s
5*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR -DTEMPLATE -DDEPENDENT %s | opt -instnamer -S | FileCheck %s
6*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR -DTEMPLATE -DDEPENDENT %s | opt -instnamer -S | FileCheck %s
7*67e74705SXin Li 
8*67e74705SXin Li struct A {
9*67e74705SXin Li   A();
10*67e74705SXin Li   A(const A &);
11*67e74705SXin Li   ~A();
12*67e74705SXin Li };
13*67e74705SXin Li 
14*67e74705SXin Li struct B {
15*67e74705SXin Li   B();
16*67e74705SXin Li   B(const B &);
17*67e74705SXin Li   ~B();
18*67e74705SXin Li };
19*67e74705SXin Li 
20*67e74705SXin Li struct C {
21*67e74705SXin Li   C(const B &);
22*67e74705SXin Li   C(const C &);
23*67e74705SXin Li   ~C();
24*67e74705SXin Li };
25*67e74705SXin Li 
26*67e74705SXin Li struct E;
27*67e74705SXin Li struct D {
28*67e74705SXin Li   D(const C &);
29*67e74705SXin Li   D(const D &);
30*67e74705SXin Li   ~D();
31*67e74705SXin Li };
32*67e74705SXin Li E begin(D);
33*67e74705SXin Li E end(D);
34*67e74705SXin Li 
35*67e74705SXin Li struct F;
36*67e74705SXin Li struct G;
37*67e74705SXin Li struct H;
38*67e74705SXin Li struct E {
39*67e74705SXin Li   E(const E &);
40*67e74705SXin Li   ~E();
41*67e74705SXin Li   F operator*();
42*67e74705SXin Li   G operator++();
43*67e74705SXin Li   H operator!=(const E &o);
44*67e74705SXin Li };
45*67e74705SXin Li 
46*67e74705SXin Li struct I;
47*67e74705SXin Li struct F {
48*67e74705SXin Li   F(const F &);
49*67e74705SXin Li   ~F();
50*67e74705SXin Li   operator I();
51*67e74705SXin Li };
52*67e74705SXin Li 
53*67e74705SXin Li struct G {
54*67e74705SXin Li   G(const G &);
55*67e74705SXin Li   ~G();
56*67e74705SXin Li   operator bool();
57*67e74705SXin Li };
58*67e74705SXin Li 
59*67e74705SXin Li struct H {
60*67e74705SXin Li   H(const H &);
61*67e74705SXin Li   ~H();
62*67e74705SXin Li   operator bool();
63*67e74705SXin Li };
64*67e74705SXin Li 
65*67e74705SXin Li struct I {
66*67e74705SXin Li   I(const I &);
67*67e74705SXin Li   ~I();
68*67e74705SXin Li };
69*67e74705SXin Li 
70*67e74705SXin Li void body(const I &);
71*67e74705SXin Li 
72*67e74705SXin Li #ifdef TEMPLATE
73*67e74705SXin Li #ifdef DEPENDENT
74*67e74705SXin Li template<typename D>
75*67e74705SXin Li #else
76*67e74705SXin Li template<typename>
77*67e74705SXin Li #endif
78*67e74705SXin Li #endif
for_temps()79*67e74705SXin Li void for_temps() {
80*67e74705SXin Li   A a;
81*67e74705SXin Li #ifdef DESUGAR
82*67e74705SXin Li   {
83*67e74705SXin Li     auto && __range = D(B());
84*67e74705SXin Li     for (auto __begin = begin(__range), __end = end(__range);
85*67e74705SXin Li          __begin != __end; ++__begin) {
86*67e74705SXin Li       I i = *__begin;
87*67e74705SXin Li       body(i);
88*67e74705SXin Li     }
89*67e74705SXin Li   }
90*67e74705SXin Li #else
91*67e74705SXin Li   for (I i : D(B())) {
92*67e74705SXin Li     body(i);
93*67e74705SXin Li   }
94*67e74705SXin Li #endif
95*67e74705SXin Li }
96*67e74705SXin Li 
97*67e74705SXin Li #ifdef TEMPLATE
98*67e74705SXin Li template void for_temps<D>();
99*67e74705SXin Li #endif
100*67e74705SXin Li 
101*67e74705SXin Li // CHECK: define {{.*}}for_temps
102*67e74705SXin Li // CHECK: call void @_ZN1AC1Ev(
103*67e74705SXin Li // CHECK: call void @_ZN1BC1Ev(
104*67e74705SXin Li // CHECK: call void @_ZN1CC1ERK1B(
105*67e74705SXin Li // CHECK: call void @_ZN1DC1ERK1C(
106*67e74705SXin Li // CHECK: call void @_ZN1CD1Ev(
107*67e74705SXin Li // CHECK: call void @_ZN1BD1Ev(
108*67e74705SXin Li // CHECK: call void @_ZN1DC1ERKS_(
109*67e74705SXin Li // CHECK: call void @_Z5begin1D(
110*67e74705SXin Li // CHECK: call void @_ZN1DD1Ev(
111*67e74705SXin Li // CHECK: call void @_ZN1DC1ERKS_(
112*67e74705SXin Li // CHECK: call void @_Z3end1D(
113*67e74705SXin Li // CHECK: call void @_ZN1DD1Ev(
114*67e74705SXin Li // CHECK: br label %[[COND:.*]]
115*67e74705SXin Li 
116*67e74705SXin Li // CHECK: [[COND]]:
117*67e74705SXin Li // CHECK: call void @_ZN1EneERKS_(
118*67e74705SXin Li // CHECK: %[[CMP:.*]] = call zeroext i1 @_ZN1HcvbEv(
119*67e74705SXin Li // CHECK: call void @_ZN1HD1Ev(
120*67e74705SXin Li // CHECK: br i1 %[[CMP]], label %[[BODY:.*]], label %[[CLEANUP:.*]]
121*67e74705SXin Li 
122*67e74705SXin Li // CHECK: [[CLEANUP]]:
123*67e74705SXin Li // CHECK: call void @_ZN1ED1Ev(
124*67e74705SXin Li // CHECK: call void @_ZN1ED1Ev(
125*67e74705SXin Li // In for-range:
126*67e74705SXin Li // call void @_ZN1DD1Ev(
127*67e74705SXin Li // CHECK: br label %[[END:.*]]
128*67e74705SXin Li 
129*67e74705SXin Li // CHECK: [[BODY]]:
130*67e74705SXin Li // CHECK: call void @_ZN1EdeEv(
131*67e74705SXin Li // CHECK: call void @_ZN1Fcv1IEv(
132*67e74705SXin Li // CHECK: call void @_ZN1FD1Ev(
133*67e74705SXin Li // CHECK: call void @_Z4bodyRK1I(
134*67e74705SXin Li // CHECK: call void @_ZN1ID1Ev(
135*67e74705SXin Li // CHECK: br label %[[INC:.*]]
136*67e74705SXin Li 
137*67e74705SXin Li // CHECK: [[INC]]:
138*67e74705SXin Li // CHECK: call void @_ZN1EppEv(
139*67e74705SXin Li // CHECK: call void @_ZN1GD1Ev(
140*67e74705SXin Li // CHECK: br label %[[COND]]
141*67e74705SXin Li 
142*67e74705SXin Li // CHECK: [[END]]:
143*67e74705SXin Li // In desugared version:
144*67e74705SXin Li // call void @_ZN1DD1Ev(
145*67e74705SXin Li // CHECK: call void @_ZN1AD1Ev(
146*67e74705SXin Li // CHECK: ret void
147