Open
Description
The following should trigger a warning that we can only match on PartialEq consts, but it doesn't: (example by @lcnr, then slightly tweaked)
use std::marker::PhantomData;
struct Inv<'a>(PhantomData<*mut &'a ()>);
// This type is only sometimes `PartialEq`.
impl PartialEq for Inv<'static> {
fn eq(&self, _: &Inv<'static>) -> bool {
true
}
}
impl<'a> Inv<'a> {
// The value `None` makes this have structural equality for any type `Self`.
const NOT_STATIC: Option<Self> = None;
}
fn foo<'a>(x: Option<Inv<'a>>) {
match x {
Inv::<'a>::NOT_STATIC => (),
Some(_) => panic!()
}
// Enabling the next line confirms that the type does
// indeed not implement `PartialEq`.
//x == Inv::<'a>::NOT_STATIC;
}
fn main() {
foo(None)
}
Here is another example of the same issue.
The problem is that we call predicate_must_hold_modulo_regions
here, but only borrowck knows the actual lifetimes and borrowck has no idea that this trait obligation even exists.
We should leave some sort of trace in MIR that there is a PartialEq obligations to ensure borrowck can check this with the right lifetimes.