diff --git a/crates/salsa/src/derived.rs b/crates/salsa/src/derived.rs index c0d4d674f7..8b2fdd6b19 100644 --- a/crates/salsa/src/derived.rs +++ b/crates/salsa/src/derived.rs @@ -43,6 +43,7 @@ where impl DerivedStorage where Q: QueryFunction, + Q::Value: Eq, { fn slot(&self, key: &Q::Key) -> Arc> { if let Some(v) = self.slot_map.read().get(key) { @@ -64,6 +65,7 @@ where impl QueryStorageOps for DerivedStorage where Q: QueryFunction, + Q::Value: Eq, { const CYCLE_STRATEGY: crate::plumbing::CycleRecoveryStrategy = Q::CYCLE_STRATEGY; @@ -139,6 +141,7 @@ where impl DerivedQueryStorageOps for DerivedStorage where Q: QueryFunction, + Q::Value: Eq, { fn invalidate(&self, runtime: &mut Runtime, key: &S) where diff --git a/crates/salsa/src/derived/slot.rs b/crates/salsa/src/derived/slot.rs index b5c3d9f4f2..de7a397607 100644 --- a/crates/salsa/src/derived/slot.rs +++ b/crates/salsa/src/derived/slot.rs @@ -94,6 +94,7 @@ enum MaybeChangedSinceProbeState { impl Slot where Q: QueryFunction, + Q::Value: Eq, { pub(super) fn new(database_key_index: DatabaseKeyIndex) -> Self { Self { @@ -270,7 +271,7 @@ where // used to be, that is a "breaking change" that our // consumers must be aware of. Becoming *more* durable // is not. See the test `constant_to_non_constant`. - if revisions.durability >= old_memo.revisions.durability { + if revisions.durability >= old_memo.revisions.durability && old_memo.value == value { debug!( "read_upgrade({:?}): value is equal, back-dating to {:?}", self, old_memo.revisions.changed_at, @@ -550,6 +551,7 @@ where struct PanicGuard<'me, Q> where Q: QueryFunction, + Q::Value: Eq, { slot: &'me Slot, runtime: &'me Runtime, @@ -558,6 +560,7 @@ where impl<'me, Q> PanicGuard<'me, Q> where Q: QueryFunction, + Q::Value: Eq, { fn new(slot: &'me Slot, runtime: &'me Runtime) -> Self { Self { slot, runtime } @@ -616,6 +619,7 @@ Please report this bug to https://github.com/salsa-rs/salsa/issues." impl<'me, Q> Drop for PanicGuard<'me, Q> where Q: QueryFunction, + Q::Value: Eq, { fn drop(&mut self) { if std::thread::panicking() {