//! Regression test for https://github.com/rust-lang/rust/issues/15924 //@ run-pass use std::marker::PhantomData; trait Encoder { type Error; } trait Encodable { fn encode(&self, s: &mut S) -> Result<(), S::Error>; } impl Encodable for i32 { fn encode(&self, _s: &mut S) -> Result<(), S::Error> { Ok(()) } } struct JsonEncoder<'a>(PhantomData<&'a mut ()>); impl Encoder for JsonEncoder<'_> { type Error = (); } // This function uses higher-ranked trait bounds, which previously caused ICE fn encode_json Encodable>>(object: &T) -> Result { let s = String::new(); { let mut encoder = JsonEncoder(PhantomData); object.encode(&mut encoder)?; } Ok(s) } // Structure with HRTB constraint that was problematic struct Foo Encodable>> { v: T, } // Drop implementation that exercises the HRTB bounds impl Encodable>> Drop for Foo { fn drop(&mut self) { let _ = encode_json(&self.v); } } fn main() { let _ = Foo { v: 10 }; }