]> git.lizzy.rs Git - rust.git/blob - tests/ui-fulldeps/issue-15924.rs
Rollup merge of #106717 - klensy:typo, r=lcnr
[rust.git] / tests / ui-fulldeps / issue-15924.rs
1 // run-pass
2
3 #![allow(unused_imports)]
4 #![allow(unused_must_use)]
5 // pretty-expanded FIXME #23616
6
7 use std::fmt;
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 }
40
41 struct Foo<T: for<'a> Encodable<JsonEncoder<'a>>> {
42     v: T,
43 }
44
45 impl<T: for<'a> Encodable<JsonEncoder<'a>>> Drop for Foo<T> {
46     fn drop(&mut self) {
47         encode_json(&self.v);
48     }
49 }
50
51 fn main() {
52     let _ = Foo { v: 10 };
53 }