|
10 | 10 |
|
11 | 11 | // Example taken from RFC 1238 text
|
12 | 12 |
|
13 |
| -// https://github.com/rust-lang/rfcs/blob/master/text/1238-nonparametric-dropck.md#examples-of-code-that-will-start-to-be-rejected |
| 13 | +// https://github.com/rust-lang/rfcs/blob/master/text/1238-nonparametric-dropck.md |
| 14 | +// #examples-of-code-that-will-start-to-be-rejected |
14 | 15 |
|
15 | 16 | // Compare against test/run-pass/issue28498-must-work-ex2.rs
|
16 | 17 |
|
17 | 18 | use std::cell::Cell;
|
18 | 19 |
|
19 |
| -#[derive(Copy, Clone, Debug)] |
20 |
| -enum Validity { Valid, Invalid } |
21 |
| -use self::Validity::{Valid, Invalid}; |
| 20 | +struct Concrete<'a>(u32, Cell<Option<&'a Concrete<'a>>>); |
22 | 21 |
|
23 |
| -struct Abstract<T> { |
24 |
| - id: u32, |
25 |
| - nbor: Cell<Option<T>>, |
26 |
| - valid: Validity, |
27 |
| - observe: fn(&Cell<Option<T>>) -> (u32, Validity), |
28 |
| -} |
29 |
| - |
30 |
| -#[derive(Copy, Clone)] |
31 |
| -struct Neighbor<'a>(&'a Abstract<Neighbor<'a>>); |
32 |
| - |
33 |
| -fn observe(c: &Cell<Option<Neighbor>>) -> (u32, Validity) { |
34 |
| - let r = c.get().unwrap().0; |
35 |
| - (r.id, r.valid) |
36 |
| -} |
37 |
| - |
38 |
| -impl<'a> Abstract<Neighbor<'a>> { |
39 |
| - fn new(id: u32) -> Self { |
40 |
| - Abstract { |
41 |
| - id: id, |
42 |
| - nbor: Cell::new(None), |
43 |
| - valid: Valid, |
44 |
| - observe: observe |
45 |
| - } |
46 |
| - } |
47 |
| -} |
| 22 | +struct Foo<T> { data: Vec<T> } |
48 | 23 |
|
49 |
| -struct Foo<T> { |
50 |
| - data: Vec<T>, |
| 24 | +fn potentially_specialized_wrt_t<T>(t: &T) { |
| 25 | + // Hypothetical code that does one thing for generic T and then is |
| 26 | + // specialized for T == Concrete (and the specialized form can |
| 27 | + // then access a reference held in concrete tuple). |
| 28 | + // |
| 29 | + // (We don't have specialization yet, but we want to allow for it |
| 30 | + // in the future.) |
51 | 31 | }
|
52 | 32 |
|
53 |
| -impl<T> Drop for Abstract<T> { |
| 33 | +impl<T> Drop for Foo<T> { |
54 | 34 | fn drop(&mut self) {
|
55 |
| - let (nbor_id, nbor_valid) = (self.observe)(&self.nbor); |
56 |
| - println!("dropping element {} ({:?}), observed neighbor {} ({:?})", |
57 |
| - self.id, |
58 |
| - self.valid, |
59 |
| - nbor_id, |
60 |
| - nbor_valid); |
61 |
| - self.valid = Invalid; |
| 35 | + potentially_specialized_wrt_t(&self.data[0]) |
62 | 36 | }
|
63 | 37 | }
|
64 | 38 |
|
65 | 39 | fn main() {
|
66 |
| - let mut foo: Foo<Abstract<Neighbor>> = Foo { data: Vec::new() }; |
67 |
| - foo.data.push(Abstract::new(0)); |
68 |
| - foo.data.push(Abstract::new(1)); |
| 40 | + let mut foo = Foo { data: Vec::new() }; |
| 41 | + foo.data.push(Concrete(0, Cell::new(None))); |
| 42 | + foo.data.push(Concrete(0, Cell::new(None))); |
69 | 43 |
|
70 |
| - foo.data[0].nbor.set(Some(Neighbor(&foo.data[1]))); |
| 44 | + foo.data[0].1.set(Some(&foo.data[1])); |
71 | 45 | //~^ ERROR `foo.data` does not live long enough
|
72 |
| - foo.data[1].nbor.set(Some(Neighbor(&foo.data[0]))); |
| 46 | + foo.data[1].1.set(Some(&foo.data[0])); |
73 | 47 | //~^ ERROR `foo.data` does not live long enough
|
74 | 48 | }
|
0 commit comments