// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - %s | opt -instnamer -S | FileCheck %s struct A { A(); A(const A&); ~A(); }; struct B { B(); B(const B&); ~B(); }; struct C { C(); C(const C&); ~C(); }; struct D { D(); D(const D&); ~D(); B *begin(); B *end(); }; B *begin(C&); B *end(C&); extern B array[5]; // CHECK: define void @_Z9for_arrayv( void for_array() { // CHECK: call void @_ZN1AC1Ev(%struct.A* [[A:.*]]) A a; for (B b : array) { // CHECK-NOT: 5begin // CHECK-NOT: 3end // CHECK: getelementptr {{.*}}, i32 0 // CHECK: getelementptr {{.*}}, i64 1, i64 0 // CHECK: br label %[[COND:.*]] // CHECK: [[COND]]: // CHECK: %[[CMP:.*]] = icmp ne // CHECK: br i1 %[[CMP]], label %[[BODY:.*]], label %[[END:.*]] // CHECK: [[BODY]]: // CHECK: call void @_ZN1BC1ERKS_( // CHECK: call void @_ZN1BD1Ev( // CHECK: br label %[[INC:.*]] // CHECK: [[INC]]: // CHECK: getelementptr {{.*}} i32 1 // CHECK: br label %[[COND]] } // CHECK: [[END]]: // CHECK: call void @_ZN1AD1Ev(%struct.A* [[A]]) // CHECK: ret void } // CHECK: define void @_Z9for_rangev( void for_range() { // CHECK: call void @_ZN1AC1Ev(%struct.A* [[A:.*]]) A a; for (B b : C()) { // CHECK: call void @_ZN1CC1Ev( // CHECK: = call %struct.B* @_Z5beginR1C( // CHECK: = call %struct.B* @_Z3endR1C( // CHECK: br label %[[COND:.*]] // CHECK: [[COND]]: // CHECK: %[[CMP:.*]] = icmp ne // CHECK: br i1 %[[CMP]], label %[[BODY:.*]], label %[[CLEANUP:.*]] // CHECK: [[CLEANUP]]: // CHECK: call void @_ZN1CD1Ev( // CHECK: br label %[[END:.*]] // CHECK: [[BODY]]: // CHECK: call void @_ZN1BC1ERKS_( // CHECK: call void @_ZN1BD1Ev( // CHECK: br label %[[INC:.*]] // CHECK: [[INC]]: // CHECK: getelementptr {{.*}} i32 1 // CHECK: br label %[[COND]] } // CHECK: [[END]]: // CHECK: call void @_ZN1AD1Ev(%struct.A* [[A]]) // CHECK: ret void } // CHECK: define void @_Z16for_member_rangev( void for_member_range() { // CHECK: call void @_ZN1AC1Ev(%struct.A* [[A:.*]]) A a; for (B b : D()) { // CHECK: call void @_ZN1DC1Ev( // CHECK: = call %struct.B* @_ZN1D5beginEv( // CHECK: = call %struct.B* @_ZN1D3endEv( // CHECK: br label %[[COND:.*]] // CHECK: [[COND]]: // CHECK: %[[CMP:.*]] = icmp ne // CHECK: br i1 %[[CMP]], label %[[BODY:.*]], label %[[CLEANUP:.*]] // CHECK: [[CLEANUP]]: // CHECK: call void @_ZN1DD1Ev( // CHECK: br label %[[END:.*]] // CHECK: [[BODY]]: // CHECK: call void @_ZN1BC1ERKS_( // CHECK: call void @_ZN1BD1Ev( // CHECK: br label %[[INC:.*]] // CHECK: [[INC]]: // CHECK: getelementptr {{.*}} i32 1 // CHECK: br label %[[COND]] } // CHECK: [[END]]: // CHECK: call void @_ZN1AD1Ev(%struct.A* [[A]]) // CHECK: ret void }