]>
Commit | Line | Data |
---|---|---|
416331ca XL |
1 | // run-pass |
2 | ||
0bf4aa26 XL |
3 | #![allow(unused_imports)] |
4 | #![allow(unused_must_use)] | |
c34b1796 | 5 | // pretty-expanded FIXME #23616 |
223e47cc | 6 | |
3dfed10e | 7 | use std::fmt; |
923072b8 FG |
8 | use std::marker::PhantomData; |
9 | ||
10 | trait Encoder { | |
11 | type Error; | |
12 | } | |
13 | ||
14 | trait Encodable<S: Encoder> { | |
15 | fn encode(&self, s: &mut S) -> Result<(), S::Error>; | |
16 | } | |
17 | ||
18 | impl<S: Encoder> Encodable<S> for i32 { | |
19 | fn encode(&self, _s: &mut S) -> Result<(), S::Error> { | |
20 | Ok(()) | |
21 | } | |
22 | } | |
23 | ||
24 | struct JsonEncoder<'a>(PhantomData<&'a mut ()>); | |
25 | ||
26 | impl Encoder for JsonEncoder<'_> { | |
27 | type Error = (); | |
28 | } | |
29 | ||
30 | fn encode_json<T: for<'r> Encodable<JsonEncoder<'r>>>( | |
31 | object: &T, | |
32 | ) -> Result<String, ()> { | |
33 | let s = String::new(); | |
34 | { | |
35 | let mut encoder = JsonEncoder(PhantomData); | |
36 | object.encode(&mut encoder)?; | |
37 | } | |
38 | Ok(s) | |
39 | } | |
970d7e83 | 40 | |
923072b8 | 41 | struct Foo<T: for<'a> Encodable<JsonEncoder<'a>>> { |
1a4d82fc JJ |
42 | v: T, |
43 | } | |
223e47cc | 44 | |
923072b8 | 45 | impl<T: for<'a> Encodable<JsonEncoder<'a>>> Drop for Foo<T> { |
1a4d82fc | 46 | fn drop(&mut self) { |
923072b8 | 47 | encode_json(&self.v); |
223e47cc LB |
48 | } |
49 | } | |
50 | ||
51 | fn main() { | |
85aaf69f | 52 | let _ = Foo { v: 10 }; |
223e47cc | 53 | } |