Description
I've been tinkering locally with a crate called salsa. Along the way, I noticed that my impl permits me to add extra members. e.g., I have this trait:
pub trait QueryContext: QueryContextStorageTypes {
fn salsa_runtime(&self) -> &runtime::Runtime<Self>;
}
But in my cargo example I can use this impl:
impl salsa::QueryContext for QueryContextImpl {
fn extra(&self) -> u32 {
0
}
fn salsa_runtime(&self) -> &salsa::runtime::Runtime<QueryContextImpl> {
&self.runtime
}
}
What the heck is going on here? I couldn't easily reproduce this in a smaller example, so I saved the commit. It did reproduce cleanly after rm -rf target
and cargo clean
, so I guess it's (probably?) not an incremental bug.
To reproduce:
- Clone the salsa repo at https://github.com/nikomatsakis/salsa and go to the commit
36e2b9cdcc01228560f9fb7ffdfadf466d21e60d
. - Run
cargo build --example storage_varieties
- Observe that build does not fail
Marking as T-compiler and P-high. P-high because this could be a very dangerous bug in terms of backwards compat risk! But I'm hoping it's something more bizarre (e.g., not rebuilding when I think it is). I did validate though that adding other weird stuff (e.g., invalid tokens) causes compilation to fail. Assigning to myself to investigate on Monday.