diff options
Diffstat (limited to 'src/test/ui/mir/mir-typeck-normalize-fn-sig.rs')
-rw-r--r-- | src/test/ui/mir/mir-typeck-normalize-fn-sig.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/test/ui/mir/mir-typeck-normalize-fn-sig.rs b/src/test/ui/mir/mir-typeck-normalize-fn-sig.rs new file mode 100644 index 000000000..bdd9321af --- /dev/null +++ b/src/test/ui/mir/mir-typeck-normalize-fn-sig.rs @@ -0,0 +1,30 @@ +// 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 }; +} |