2019-02-20 10:39:04 +00:00
|
|
|
// Regression test for #46989:
|
|
|
|
//
|
|
|
|
// In the move to universes, this test started passing.
|
|
|
|
// It is not necessarily WRONG to do so, but it was a bit
|
|
|
|
// surprising. The reason that it passed is that when we were
|
|
|
|
// asked to prove that
|
|
|
|
//
|
|
|
|
// for<'a> fn(&'a i32): Foo
|
|
|
|
//
|
|
|
|
// we were able to use the impl below to prove
|
|
|
|
//
|
|
|
|
// fn(&'empty i32): Foo
|
|
|
|
//
|
|
|
|
// and then we were able to prove that
|
|
|
|
//
|
|
|
|
// fn(&'empty i32) = for<'a> fn(&'a i32)
|
|
|
|
//
|
|
|
|
// This last fact is somewhat surprising, but essentially "falls out"
|
|
|
|
// from handling variance correctly. In particular, consider the subtyping
|
|
|
|
// relations. First:
|
|
|
|
//
|
|
|
|
// fn(&'empty i32) <: for<'a> fn(&'a i32)
|
|
|
|
//
|
|
|
|
// This holds because -- intuitively -- a fn that takes a reference but doesn't use
|
|
|
|
// it can be given a reference with any lifetime. Similarly, the opposite direction:
|
|
|
|
//
|
|
|
|
// for<'a> fn(&'a i32) <: fn(&'empty i32)
|
|
|
|
//
|
|
|
|
// holds because 'a can be instantiated to 'empty.
|
|
|
|
|
2020-05-22 17:48:07 +00:00
|
|
|
trait Foo {}
|
2019-02-20 10:39:04 +00:00
|
|
|
|
2020-05-22 17:48:07 +00:00
|
|
|
impl<A> Foo for fn(A) {}
|
2019-02-20 10:39:04 +00:00
|
|
|
|
|
|
|
fn assert_foo<T: Foo>() {}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
assert_foo::<fn(&i32)>();
|
2020-05-22 17:48:07 +00:00
|
|
|
//~^ ERROR implementation of `Foo` is not general enough
|
2019-02-20 10:39:04 +00:00
|
|
|
}
|