forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			147 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR %s | opt -instnamer -S | FileCheck %s
 | 
						|
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR %s | opt -instnamer -S | FileCheck %s
 | 
						|
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR -DTEMPLATE %s | opt -instnamer -S | FileCheck %s
 | 
						|
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR -DTEMPLATE %s | opt -instnamer -S | FileCheck %s
 | 
						|
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -UDESUGAR -DTEMPLATE -DDEPENDENT %s | opt -instnamer -S | FileCheck %s
 | 
						|
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++11 -emit-llvm -o - -DDESUGAR -DTEMPLATE -DDEPENDENT %s | opt -instnamer -S | FileCheck %s
 | 
						|
 | 
						|
struct A {
 | 
						|
  A();
 | 
						|
  A(const A &);
 | 
						|
  ~A();
 | 
						|
};
 | 
						|
 | 
						|
struct B {
 | 
						|
  B();
 | 
						|
  B(const B &);
 | 
						|
  ~B();
 | 
						|
};
 | 
						|
 | 
						|
struct C {
 | 
						|
  C(const B &);
 | 
						|
  C(const C &);
 | 
						|
  ~C();
 | 
						|
};
 | 
						|
 | 
						|
struct E;
 | 
						|
struct D {
 | 
						|
  D(const C &);
 | 
						|
  D(const D &);
 | 
						|
  ~D();
 | 
						|
};
 | 
						|
E begin(D);
 | 
						|
E end(D);
 | 
						|
 | 
						|
struct F;
 | 
						|
struct G;
 | 
						|
struct H;
 | 
						|
struct E {
 | 
						|
  E(const E &);
 | 
						|
  ~E();
 | 
						|
  F operator*();
 | 
						|
  G operator++();
 | 
						|
  H operator!=(const E &o);
 | 
						|
};
 | 
						|
 | 
						|
struct I;
 | 
						|
struct F {
 | 
						|
  F(const F &);
 | 
						|
  ~F();
 | 
						|
  operator I();
 | 
						|
};
 | 
						|
 | 
						|
struct G {
 | 
						|
  G(const G &);
 | 
						|
  ~G();
 | 
						|
  operator bool();
 | 
						|
};
 | 
						|
 | 
						|
struct H {
 | 
						|
  H(const H &);
 | 
						|
  ~H();
 | 
						|
  operator bool();
 | 
						|
};
 | 
						|
 | 
						|
struct I {
 | 
						|
  I(const I &);
 | 
						|
  ~I();
 | 
						|
};
 | 
						|
 | 
						|
void body(const I &);
 | 
						|
 | 
						|
#ifdef TEMPLATE
 | 
						|
#ifdef DEPENDENT
 | 
						|
template<typename D>
 | 
						|
#else
 | 
						|
template<typename>
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
void for_temps() {
 | 
						|
  A a;
 | 
						|
#ifdef DESUGAR
 | 
						|
  {
 | 
						|
    auto && __range = D(B());
 | 
						|
    for (auto __begin = begin(__range), __end = end(__range);
 | 
						|
         __begin != __end; ++__begin) {
 | 
						|
      I i = *__begin;
 | 
						|
      body(i);
 | 
						|
    }
 | 
						|
  }
 | 
						|
#else
 | 
						|
  for (I i : D(B())) {
 | 
						|
    body(i);
 | 
						|
  }
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
#ifdef TEMPLATE
 | 
						|
template void for_temps<D>();
 | 
						|
#endif
 | 
						|
 | 
						|
// CHECK: define {{.*}}for_temps
 | 
						|
// CHECK: call void @_ZN1AC1Ev(
 | 
						|
// CHECK: call void @_ZN1BC1Ev(
 | 
						|
// CHECK: call void @_ZN1CC1ERK1B(
 | 
						|
// CHECK: call void @_ZN1DC1ERK1C(
 | 
						|
// CHECK: call void @_ZN1CD1Ev(
 | 
						|
// CHECK: call void @_ZN1BD1Ev(
 | 
						|
// CHECK: call void @_ZN1DC1ERKS_(
 | 
						|
// CHECK: call void @_Z5begin1D(
 | 
						|
// CHECK: call void @_ZN1DD1Ev(
 | 
						|
// CHECK: call void @_ZN1DC1ERKS_(
 | 
						|
// CHECK: call void @_Z3end1D(
 | 
						|
// CHECK: call void @_ZN1DD1Ev(
 | 
						|
// CHECK: br label %[[COND:.*]]
 | 
						|
 | 
						|
// CHECK: [[COND]]:
 | 
						|
// CHECK: call void @_ZN1EneERKS_(
 | 
						|
// CHECK: %[[CMP:.*]] = call zeroext i1 @_ZN1HcvbEv(
 | 
						|
// CHECK: call void @_ZN1HD1Ev(
 | 
						|
// CHECK: br i1 %[[CMP]], label %[[BODY:.*]], label %[[CLEANUP:.*]]
 | 
						|
 | 
						|
// CHECK: [[CLEANUP]]:
 | 
						|
// CHECK: call void @_ZN1ED1Ev(
 | 
						|
// CHECK: call void @_ZN1ED1Ev(
 | 
						|
// In for-range:
 | 
						|
// call void @_ZN1DD1Ev(
 | 
						|
// CHECK: br label %[[END:.*]]
 | 
						|
 | 
						|
// CHECK: [[BODY]]:
 | 
						|
// CHECK: call void @_ZN1EdeEv(
 | 
						|
// CHECK: call void @_ZN1Fcv1IEv(
 | 
						|
// CHECK: call void @_ZN1FD1Ev(
 | 
						|
// CHECK: call void @_Z4bodyRK1I(
 | 
						|
// CHECK: call void @_ZN1ID1Ev(
 | 
						|
// CHECK: br label %[[INC:.*]]
 | 
						|
 | 
						|
// CHECK: [[INC]]:
 | 
						|
// CHECK: call void @_ZN1EppEv(
 | 
						|
// CHECK: call void @_ZN1GD1Ev(
 | 
						|
// CHECK: br label %[[COND]]
 | 
						|
 | 
						|
// CHECK: [[END]]:
 | 
						|
// In desugared version:
 | 
						|
// call void @_ZN1DD1Ev(
 | 
						|
// CHECK: call void @_ZN1AD1Ev(
 | 
						|
// CHECK: ret void
 |