]> git.lizzy.rs Git - rust.git/blob - src/test/debug-info/recursive-struct.rs
Ignore tests broken by failing on ICE
[rust.git] / src / test / debug-info / recursive-struct.rs
1 // Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 // ignore-android: FIXME(#10381)
12
13 #![feature(managed_boxes)]
14
15 // compile-flags:-g
16 // debugger:set print pretty off
17 // debugger:rbreak zzz
18 // debugger:run
19 // debugger:finish
20
21 // debugger:print stack_unique.value
22 // check:$1 = 0
23 // debugger:print stack_unique.next.val->value
24 // check:$2 = 1
25
26 // debugger:print unique_unique->value
27 // check:$3 = 2
28 // debugger:print unique_unique->next.val->value
29 // check:$4 = 3
30
31 // debugger:print box_unique->val.value
32 // check:$5 = 4
33 // debugger:print box_unique->val.next.val->value
34 // check:$6 = 5
35
36 // debugger:print vec_unique[0].value
37 // check:$7 = 6.5
38 // debugger:print vec_unique[0].next.val->value
39 // check:$8 = 7.5
40
41 // debugger:print borrowed_unique->value
42 // check:$9 = 8.5
43 // debugger:print borrowed_unique->next.val->value
44 // check:$10 = 9.5
45
46 // MANAGED
47 // debugger:print stack_managed.value
48 // check:$11 = 10
49 // debugger:print stack_managed.next.val->val.value
50 // check:$12 = 11
51
52 // debugger:print unique_managed->value
53 // check:$13 = 12
54 // debugger:print unique_managed->next.val->val.value
55 // check:$14 = 13
56
57 // debugger:print box_managed->val.value
58 // check:$15 = 14
59 // debugger:print box_managed->val.next.val->val.value
60 // check:$16 = 15
61
62 // debugger:print vec_managed[0].value
63 // check:$17 = 16.5
64 // debugger:print vec_managed[0].next.val->val.value
65 // check:$18 = 17.5
66
67 // debugger:print borrowed_managed->value
68 // check:$19 = 18.5
69 // debugger:print borrowed_managed->next.val->val.value
70 // check:$20 = 19.5
71
72 // LONG CYCLE
73 // debugger:print long_cycle1.value
74 // check:$21 = 20
75 // debugger:print long_cycle1.next->value
76 // check:$22 = 21
77 // debugger:print long_cycle1.next->next->value
78 // check:$23 = 22
79 // debugger:print long_cycle1.next->next->next->value
80 // check:$24 = 23
81
82 // debugger:print long_cycle2.value
83 // check:$25 = 24
84 // debugger:print long_cycle2.next->value
85 // check:$26 = 25
86 // debugger:print long_cycle2.next->next->value
87 // check:$27 = 26
88
89 // debugger:print long_cycle3.value
90 // check:$28 = 27
91 // debugger:print long_cycle3.next->value
92 // check:$29 = 28
93
94 // debugger:print long_cycle4.value
95 // check:$30 = 29.5
96
97 // debugger:print (*****long_cycle_w_anonymous_types).value
98 // check:$31 = 30
99
100 // debugger:print (*****((*****long_cycle_w_anonymous_types).next.val)).value
101 // check:$32 = 31
102
103 // debugger:continue
104
105 #![allow(unused_variable)]
106 #![feature(struct_variant)]
107
108 enum Opt<T> {
109     Empty,
110     Val { val: T }
111 }
112
113 struct UniqueNode<T> {
114     next: Opt<~UniqueNode<T>>,
115     value: T
116 }
117
118 struct ManagedNode<T> {
119     next: Opt<@ManagedNode<T>>,
120     value: T
121 }
122
123 struct LongCycle1<T> {
124     next: ~LongCycle2<T>,
125     value: T,
126 }
127
128 struct LongCycle2<T> {
129     next: ~LongCycle3<T>,
130     value: T,
131 }
132
133 struct LongCycle3<T> {
134     next: ~LongCycle4<T>,
135     value: T,
136 }
137
138 struct LongCycle4<T> {
139     next: Option<~LongCycle1<T>>,
140     value: T,
141 }
142
143 struct LongCycleWithAnonymousTypes {
144     next: Opt<~~~~~LongCycleWithAnonymousTypes>,
145     value: uint,
146 }
147
148 // This test case makes sure that recursive structs are properly described. The Node structs are
149 // generic so that we can have a new type (that newly needs to be described) for the different
150 // cases. The potential problem with recursive types is that the DI generation algorithm gets
151 // trapped in an endless loop. To make sure, we actually test this in the different cases, we have
152 // to operate on a new type each time, otherwise we would just hit the DI cache for all but the
153 // first case.
154
155 // The different cases below (stack_*, unique_*, box_*, etc) are set up so that the type description
156 // algorithm will enter the type reference cycle that is created by a recursive definition from a
157 // different context each time.
158
159 // The "long cycle" cases are constructed to span a longer, indirect recursion cycle between types.
160 // The different locals will cause the DI algorithm to enter the type reference cycle at different
161 // points.
162
163 fn main() {
164     let stack_unique: UniqueNode<u16> = UniqueNode {
165         next: Val {
166             val: ~UniqueNode {
167                 next: Empty,
168                 value: 1_u16,
169             }
170         },
171         value: 0_u16,
172     };
173
174     let unique_unique: ~UniqueNode<u32> = ~UniqueNode {
175         next: Val {
176             val: ~UniqueNode {
177                 next: Empty,
178                 value: 3,
179             }
180         },
181         value: 2,
182     };
183
184     let box_unique: @UniqueNode<u64> = @UniqueNode {
185         next: Val {
186             val: ~UniqueNode {
187                 next: Empty,
188                 value: 5,
189             }
190         },
191         value: 4,
192     };
193
194     let vec_unique: [UniqueNode<f32>, ..1] = [UniqueNode {
195         next: Val {
196             val: ~UniqueNode {
197                 next: Empty,
198                 value: 7.5,
199             }
200         },
201         value: 6.5,
202     }];
203
204     let borrowed_unique: &UniqueNode<f64> = &UniqueNode {
205         next: Val {
206             val: ~UniqueNode {
207                 next: Empty,
208                 value: 9.5,
209             }
210         },
211         value: 8.5,
212     };
213
214     let stack_managed: ManagedNode<u16> = ManagedNode {
215         next: Val {
216             val: @ManagedNode {
217                 next: Empty,
218                 value: 11,
219             }
220         },
221         value: 10,
222     };
223
224     let unique_managed: ~ManagedNode<u32> = ~ManagedNode {
225         next: Val {
226             val: @ManagedNode {
227                 next: Empty,
228                 value: 13,
229             }
230         },
231         value: 12,
232     };
233
234     let box_managed: @ManagedNode<u64> = @ManagedNode {
235         next: Val {
236             val: @ManagedNode {
237                 next: Empty,
238                 value: 15,
239             }
240         },
241         value: 14,
242     };
243
244     let vec_managed: [ManagedNode<f32>, ..1] = [ManagedNode {
245         next: Val {
246             val: @ManagedNode {
247                 next: Empty,
248                 value: 17.5,
249             }
250         },
251         value: 16.5,
252     }];
253
254     let borrowed_managed: &ManagedNode<f64> = &ManagedNode {
255         next: Val {
256             val: @ManagedNode {
257                 next: Empty,
258                 value: 19.5,
259             }
260         },
261         value: 18.5,
262     };
263
264     // LONG CYCLE
265     let long_cycle1: LongCycle1<u16> = LongCycle1 {
266         next: ~LongCycle2 {
267             next: ~LongCycle3 {
268                 next: ~LongCycle4 {
269                     next: None,
270                     value: 23,
271                 },
272                 value: 22,
273             },
274             value: 21
275         },
276         value: 20
277     };
278
279     let long_cycle2: LongCycle2<u32> = LongCycle2 {
280         next: ~LongCycle3 {
281             next: ~LongCycle4 {
282                 next: None,
283                 value: 26,
284             },
285             value: 25,
286         },
287         value: 24
288     };
289
290     let long_cycle3: LongCycle3<u64> = LongCycle3 {
291         next: ~LongCycle4 {
292             next: None,
293             value: 28,
294         },
295         value: 27,
296     };
297
298     let long_cycle4: LongCycle4<f32> = LongCycle4 {
299         next: None,
300         value: 29.5,
301     };
302
303     // It's important that LongCycleWithAnonymousTypes is encountered only at the end of the
304     // `~` chain.
305     let long_cycle_w_anonymous_types = ~~~~~LongCycleWithAnonymousTypes {
306         next: Val {
307             val: ~~~~~LongCycleWithAnonymousTypes {
308                 next: Empty,
309                 value: 31,
310             }
311         },
312         value: 30
313     };
314
315     zzz();
316 }
317
318 fn zzz() {()}
319