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