Rollup merge of #110986 - cjgillot:delay-feed-bug, r=WaffleLapkin

Delay a bug when overwriting fed value.

Fixes https://github.com/rust-lang/rust/issues/110887
This commit is contained in:
Dylan DPC 2023-05-18 17:37:07 +05:30 committed by GitHub
commit f2b213cfc4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 15 deletions

View file

@ -533,12 +533,20 @@ pub fn $name(self, value: query_provided::$name<'tcx>) {
let (value_hash, old_hash): (Fingerprint, Fingerprint) = tcx.with_stable_hashing_context(|mut hcx| let (value_hash, old_hash): (Fingerprint, Fingerprint) = tcx.with_stable_hashing_context(|mut hcx|
(hasher(&mut hcx, &value), hasher(&mut hcx, &old)) (hasher(&mut hcx, &value), hasher(&mut hcx, &old))
); );
assert_eq!( if old_hash != value_hash {
old_hash, value_hash, // We have an inconsistency. This can happen if one of the two
"Trying to feed an already recorded value for query {} key={key:?}:\nold value: {old:?}\nnew value: {value:?}", // results is tainted by errors. In this case, delay a bug to
stringify!($name), // ensure compilation is doomed, and keep the `old` value.
) tcx.sess.delay_span_bug(DUMMY_SP, format!(
"Trying to feed an already recorded value for query {} key={key:?}:\n\
old value: {old:?}\nnew value: {value:?}",
stringify!($name),
));
}
} else { } else {
// The query is `no_hash`, so we have no way to perform a sanity check.
// If feeding the same value multiple times needs to be supported,
// the query should not be marked `no_hash`.
bug!( bug!(
"Trying to feed an already recorded value for query {} key={key:?}:\nold value: {old:?}\nnew value: {value:?}", "Trying to feed an already recorded value for query {} key={key:?}:\nold value: {old:?}\nnew value: {value:?}",
stringify!($name), stringify!($name),

View file

@ -433,16 +433,22 @@ fn execute_job<Q, Qcx, const INCR: bool>(
(hasher(&mut hcx, &cached_result), hasher(&mut hcx, &result)) (hasher(&mut hcx, &cached_result), hasher(&mut hcx, &result))
}); });
let formatter = query.format_value(); let formatter = query.format_value();
debug_assert_eq!( if old_hash != new_hash {
old_hash, // We have an inconsistency. This can happen if one of the two
new_hash, // results is tainted by errors. In this case, delay a bug to
"Computed query value for {:?}({:?}) is inconsistent with fed value,\n\ // ensure compilation is doomed.
computed={:#?}\nfed={:#?}", qcx.dep_context().sess().delay_span_bug(
query.dep_kind(), DUMMY_SP,
key, format!(
formatter(&result), "Computed query value for {:?}({:?}) is inconsistent with fed value,\n\
formatter(&cached_result), computed={:#?}\nfed={:#?}",
); query.dep_kind(),
key,
formatter(&result),
formatter(&cached_result),
),
);
}
} }
} }
job_owner.complete(cache, result, dep_node_index); job_owner.complete(cache, result, dep_node_index);

View file

@ -0,0 +1,17 @@
// Verify that we do not ICE when we try to overwrite an anon-const's type because of a trait
// cycle.
//
// compile-flags: -Zincremental-ignore-spans
// revisions: cpass cfail
// error-pattern: cycle detected when computing type of `Bar::N`
#![feature(trait_alias)]
#![crate_type="lib"]
#[cfg(cpass)]
trait Bar<const N: usize> {}
#[cfg(cfail)]
trait Bar<const N: dyn BB> {}
trait BB = Bar<{ 2 + 1 }>;