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
|