xref: /aosp_15_r20/external/clang/test/CodeGenCXX/for-range.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - %s | opt -instnamer -S | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li struct A {
4*67e74705SXin Li   A();
5*67e74705SXin Li   A(const A&);
6*67e74705SXin Li   ~A();
7*67e74705SXin Li };
8*67e74705SXin Li 
9*67e74705SXin Li struct B {
10*67e74705SXin Li   B();
11*67e74705SXin Li   B(const B&);
12*67e74705SXin Li   ~B();
13*67e74705SXin Li };
14*67e74705SXin Li 
15*67e74705SXin Li struct C {
16*67e74705SXin Li   C();
17*67e74705SXin Li   C(const C&);
18*67e74705SXin Li   ~C();
19*67e74705SXin Li };
20*67e74705SXin Li 
21*67e74705SXin Li struct D {
22*67e74705SXin Li   D();
23*67e74705SXin Li   D(const D&);
24*67e74705SXin Li   ~D();
25*67e74705SXin Li 
26*67e74705SXin Li   B *begin();
27*67e74705SXin Li   B *end();
28*67e74705SXin Li };
29*67e74705SXin Li 
30*67e74705SXin Li B *begin(C&);
31*67e74705SXin Li B *end(C&);
32*67e74705SXin Li 
33*67e74705SXin Li extern B array[5];
34*67e74705SXin Li 
35*67e74705SXin Li // CHECK-LABEL: define void @_Z9for_arrayv(
for_array()36*67e74705SXin Li void for_array() {
37*67e74705SXin Li   // CHECK: call void @_ZN1AC1Ev(%struct.A* [[A:.*]])
38*67e74705SXin Li   A a;
39*67e74705SXin Li   for (B b : array) {
40*67e74705SXin Li     // CHECK-NOT: 5begin
41*67e74705SXin Li     // CHECK-NOT: 3end
42*67e74705SXin Li     // CHECK: getelementptr {{.*}}, i32 0
43*67e74705SXin Li     // CHECK: getelementptr {{.*}}, i64 5
44*67e74705SXin Li     // CHECK: br label %[[COND:.*]]
45*67e74705SXin Li 
46*67e74705SXin Li     // CHECK: [[COND]]:
47*67e74705SXin Li     // CHECK: %[[CMP:.*]] = icmp ne
48*67e74705SXin Li     // CHECK: br i1 %[[CMP]], label %[[BODY:.*]], label %[[END:.*]]
49*67e74705SXin Li 
50*67e74705SXin Li     // CHECK: [[BODY]]:
51*67e74705SXin Li     // CHECK: call void @_ZN1BC1ERKS_(
52*67e74705SXin Li     // CHECK: call void @_ZN1BD1Ev(
53*67e74705SXin Li     // CHECK: br label %[[INC:.*]]
54*67e74705SXin Li 
55*67e74705SXin Li     // CHECK: [[INC]]:
56*67e74705SXin Li     // CHECK: getelementptr {{.*}} i32 1
57*67e74705SXin Li     // CHECK: br label %[[COND]]
58*67e74705SXin Li   }
59*67e74705SXin Li   // CHECK: [[END]]:
60*67e74705SXin Li   // CHECK: call void @_ZN1AD1Ev(%struct.A* [[A]])
61*67e74705SXin Li   // CHECK: ret void
62*67e74705SXin Li }
63*67e74705SXin Li 
64*67e74705SXin Li // CHECK-LABEL: define void @_Z9for_rangev(
for_range()65*67e74705SXin Li void for_range() {
66*67e74705SXin Li   // CHECK: call void @_ZN1AC1Ev(%struct.A* [[A:.*]])
67*67e74705SXin Li   A a;
68*67e74705SXin Li   for (B b : C()) {
69*67e74705SXin Li     // CHECK: call void @_ZN1CC1Ev(
70*67e74705SXin Li     // CHECK: = call %struct.B* @_Z5beginR1C(
71*67e74705SXin Li     // CHECK: = call %struct.B* @_Z3endR1C(
72*67e74705SXin Li     // CHECK: br label %[[COND:.*]]
73*67e74705SXin Li 
74*67e74705SXin Li     // CHECK: [[COND]]:
75*67e74705SXin Li     // CHECK: %[[CMP:.*]] = icmp ne
76*67e74705SXin Li     // CHECK: br i1 %[[CMP]], label %[[BODY:.*]], label %[[CLEANUP:.*]]
77*67e74705SXin Li 
78*67e74705SXin Li     // CHECK: [[CLEANUP]]:
79*67e74705SXin Li     // CHECK: call void @_ZN1CD1Ev(
80*67e74705SXin Li     // CHECK: br label %[[END:.*]]
81*67e74705SXin Li 
82*67e74705SXin Li     // CHECK: [[BODY]]:
83*67e74705SXin Li     // CHECK: call void @_ZN1BC1ERKS_(
84*67e74705SXin Li     // CHECK: call void @_ZN1BD1Ev(
85*67e74705SXin Li     // CHECK: br label %[[INC:.*]]
86*67e74705SXin Li 
87*67e74705SXin Li     // CHECK: [[INC]]:
88*67e74705SXin Li     // CHECK: getelementptr {{.*}} i32 1
89*67e74705SXin Li     // CHECK: br label %[[COND]]
90*67e74705SXin Li   }
91*67e74705SXin Li   // CHECK: [[END]]:
92*67e74705SXin Li   // CHECK: call void @_ZN1AD1Ev(%struct.A* [[A]])
93*67e74705SXin Li   // CHECK: ret void
94*67e74705SXin Li }
95*67e74705SXin Li 
96*67e74705SXin Li // CHECK-LABEL: define void @_Z16for_member_rangev(
for_member_range()97*67e74705SXin Li void for_member_range() {
98*67e74705SXin Li   // CHECK: call void @_ZN1AC1Ev(%struct.A* [[A:.*]])
99*67e74705SXin Li   A a;
100*67e74705SXin Li   for (B b : D()) {
101*67e74705SXin Li     // CHECK: call void @_ZN1DC1Ev(
102*67e74705SXin Li     // CHECK: = call %struct.B* @_ZN1D5beginEv(
103*67e74705SXin Li     // CHECK: = call %struct.B* @_ZN1D3endEv(
104*67e74705SXin Li     // CHECK: br label %[[COND:.*]]
105*67e74705SXin Li 
106*67e74705SXin Li     // CHECK: [[COND]]:
107*67e74705SXin Li     // CHECK: %[[CMP:.*]] = icmp ne
108*67e74705SXin Li     // CHECK: br i1 %[[CMP]], label %[[BODY:.*]], label %[[CLEANUP:.*]]
109*67e74705SXin Li 
110*67e74705SXin Li     // CHECK: [[CLEANUP]]:
111*67e74705SXin Li     // CHECK: call void @_ZN1DD1Ev(
112*67e74705SXin Li     // CHECK: br label %[[END:.*]]
113*67e74705SXin Li 
114*67e74705SXin Li     // CHECK: [[BODY]]:
115*67e74705SXin Li     // CHECK: call void @_ZN1BC1ERKS_(
116*67e74705SXin Li     // CHECK: call void @_ZN1BD1Ev(
117*67e74705SXin Li     // CHECK: br label %[[INC:.*]]
118*67e74705SXin Li 
119*67e74705SXin Li     // CHECK: [[INC]]:
120*67e74705SXin Li     // CHECK: getelementptr {{.*}} i32 1
121*67e74705SXin Li     // CHECK: br label %[[COND]]
122*67e74705SXin Li   }
123*67e74705SXin Li   // CHECK: [[END]]:
124*67e74705SXin Li   // CHECK: call void @_ZN1AD1Ev(%struct.A* [[A]])
125*67e74705SXin Li   // CHECK: ret void
126*67e74705SXin Li }
127