27 lines
899 B
Rust
27 lines
899 B
Rust
// Test that impls for these two types are considered ovelapping:
|
|
//
|
|
// * `for<'r> fn(fn(&'r u32))`
|
|
// * `fn(fn(&'a u32)` where `'a` is free
|
|
//
|
|
// This is because, for `'a = 'static`, the two types overlap.
|
|
// Effectively for them to be equal to you get:
|
|
//
|
|
// * `for<'r> fn(fn(&'r u32)) <: fn(fn(&'static u32))`
|
|
// * true if `exists<'r> { 'r: 'static }` (obviously true)
|
|
// * `fn(fn(&'static u32)) <: for<'r> fn(fn(&'r u32))`
|
|
// * true if `forall<'r> { 'static: 'r }` (also true)
|
|
|
|
trait Trait {}
|
|
|
|
impl Trait for for<'r> fn(fn(&'r ())) {}
|
|
impl<'a> Trait for fn(fn(&'a ())) {}
|
|
//~^ ERROR conflicting implementations
|
|
//
|
|
// Note in particular that we do NOT get a future-compatibility warning
|
|
// here. This is because the new leak-check proposed in [MCP 295] does not
|
|
// "error" when these two types are equated.
|
|
//
|
|
// [MCP 295]: https://github.com/rust-lang/compiler-team/issues/295
|
|
|
|
fn main() {}
|