blob: e487dcc3c0e8ddced007cb87c1a6a9a8083ce6bc [file] [log] [blame]
//@ revisions: explicit implicit
//@[implicit] check-pass
#![forbid(coherence_leak_check)]
#![feature(negative_impls, with_negative_coherence)]
pub trait Marker {}
#[cfg(implicit)]
impl<T: ?Sized> !Marker for &T {}
#[cfg(explicit)]
impl<'a, T: ?Sized + 'a> !Marker for &'a T {}
trait FnMarker {}
// Unifying these two impls below results in a `T: '!0` obligation
// that we shouldn't need to care about. Ideally, we'd treat that
// as an assumption when proving `&'!0 T: Marker`...
impl<T: ?Sized + Marker> FnMarker for fn(T) {}
impl<T: ?Sized> FnMarker for fn(&T) {}
//[explicit]~^ ERROR conflicting implementations of trait `FnMarker` for type `fn(&_)`
//[explicit]~| WARN the behavior may change in a future release
fn main() {}