• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++0x -emit-llvm -o - -UDESUGAR %s | opt -instnamer -S | FileCheck %s
2 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -std=c++0x -emit-llvm -o - -DDESUGAR %s | opt -instnamer -S | FileCheck %s
3 
4 struct A {
5   A();
6   A(const A &);
7   ~A();
8 };
9 
10 struct B {
11   B();
12   B(const B &);
13   ~B();
14 };
15 
16 struct C {
17   C(const B &);
18   C(const C &);
19   ~C();
20 };
21 
22 struct E;
23 struct D {
24   D(const C &);
25   D(const D &);
26   ~D();
27 };
28 E begin(D);
29 E end(D);
30 
31 struct F;
32 struct G;
33 struct H;
34 struct E {
35   E(const E &);
36   ~E();
37   F operator*();
38   G operator++();
39   H operator!=(const E &o);
40 };
41 
42 struct I;
43 struct F {
44   F(const F &);
45   ~F();
46   operator I();
47 };
48 
49 struct G {
50   G(const G &);
51   ~G();
52   operator bool();
53 };
54 
55 struct H {
56   H(const H &);
57   ~H();
58   operator bool();
59 };
60 
61 struct I {
62   I(const I &);
63   ~I();
64 };
65 
66 void body(const I &);
67 
for_temps()68 void for_temps() {
69   A a;
70 #ifdef DESUGAR
71   {
72     auto && __range = D(B());
73     for (auto __begin = begin(__range), __end = end(__range);
74          __begin != __end; ++__begin) {
75       I i = *__begin;
76       body(i);
77     }
78   }
79 #else
80   for (I i : D(B())) {
81     body(i);
82   }
83 #endif
84 }
85 
86 // CHECK: define void @_Z9for_tempsv()
87 // CHECK: call void @_ZN1AC1Ev(
88 // CHECK: call void @_ZN1BC1Ev(
89 // CHECK: call void @_ZN1CC1ERK1B(
90 // CHECK: call void @_ZN1DC1ERK1C(
91 // CHECK: call void @_ZN1CD1Ev(
92 // CHECK: call void @_ZN1BD1Ev(
93 // CHECK: call void @_ZN1DC1ERKS_(
94 // CHECK: call void @_Z5begin1D(
95 // CHECK: call void @_ZN1DD1Ev(
96 // CHECK: call void @_ZN1DC1ERKS_(
97 // CHECK: call void @_Z3end1D(
98 // CHECK: call void @_ZN1DD1Ev(
99 // CHECK: br label %[[COND:.*]]
100 
101 // CHECK: [[COND]]:
102 // CHECK: call void @_ZN1EneERKS_(
103 // CHECK: %[[CMP:.*]] = call zeroext i1 @_ZN1HcvbEv(
104 // CHECK: call void @_ZN1HD1Ev(
105 // CHECK: br i1 %[[CMP]], label %[[BODY:.*]], label %[[CLEANUP:.*]]
106 
107 // CHECK: [[CLEANUP]]:
108 // CHECK: call void @_ZN1ED1Ev(
109 // CHECK: call void @_ZN1ED1Ev(
110 // In for-range:
111 // call void @_ZN1DD1Ev(
112 // CHECK: br label %[[END:.*]]
113 
114 // CHECK: [[BODY]]:
115 // CHECK: call void @_ZN1EdeEv(
116 // CHECK: call void @_ZN1Fcv1IEv(
117 // CHECK: call void @_ZN1FD1Ev(
118 // CHECK: call void @_Z4bodyRK1I(
119 // CHECK: call void @_ZN1ID1Ev(
120 // CHECK: br label %[[INC:.*]]
121 
122 // CHECK: [[INC]]:
123 // CHECK: call void @_ZN1EppEv(
124 // CHECK: call void @_ZN1GD1Ev(
125 // CHECK: br label %[[COND]]
126 
127 // CHECK: [[END]]:
128 // In desugared version:
129 // call void @_ZN1DD1Ev(
130 // CHECK: call void @_ZN1AD1Ev(
131 // CHECK: ret void
132