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.
The following should trigger a warning that we can only match on PartialEq consts, but it doesn't: (example by @lcnr, then slightly tweaked)
Here is another example of the same issue.
The problem is that we call
predicate_must_hold_modulo_regionshere, 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.