| // run-pass |
| #![allow(unused_variables)] |
| // This code was creating an ICE in the MIR type checker. The reason |
| // is that we are reifying a reference to a function (`foo::<'x>`), |
| // which involves extracting its signature, but we were not |
| // normalizing the signature afterwards. As a result, we sometimes got |
| // errors around the `<u32 as Foo<'x>>::Value`, which can be |
| // normalized to `f64`. |
| |
| #![allow(dead_code)] |
| |
| trait Foo<'x> { |
| type Value; |
| } |
| |
| impl<'x> Foo<'x> for u32 { |
| type Value = f64; |
| } |
| |
| struct Providers<'x> { |
| foo: for<'y> fn(x: &'x u32, y: &'y u32) -> <u32 as Foo<'x>>::Value, |
| } |
| |
| fn foo<'y, 'x: 'x>(x: &'x u32, y: &'y u32) -> <u32 as Foo<'x>>::Value { |
| *x as f64 |
| } |
| |
| fn main() { |
| Providers { foo }; |
| } |