Skip to content

Commit

Permalink
Rollup merge of rust-lang#110986 - cjgillot:delay-feed-bug, r=WaffleL…
Browse files Browse the repository at this point in the history
…apkin

Delay a bug when overwriting fed value.

Fixes rust-lang#110887
  • Loading branch information
Dylan-DPC authored May 18, 2023
2 parents 9052ca9 + 3bb5d1d commit 8f2d75d
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 15 deletions.
18 changes: 13 additions & 5 deletions compiler/rustc_middle/src/query/plumbing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -533,12 +533,20 @@ macro_rules! define_feedable {
let (value_hash, old_hash): (Fingerprint, Fingerprint) = tcx.with_stable_hashing_context(|mut hcx|
(hasher(&mut hcx, &value), hasher(&mut hcx, &old))
);
assert_eq!(
old_hash, value_hash,
"Trying to feed an already recorded value for query {} key={key:?}:\nold value: {old:?}\nnew value: {value:?}",
stringify!($name),
)
if old_hash != value_hash {
// We have an inconsistency. This can happen if one of the two
// results is tainted by errors. In this case, delay a bug to
// 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 {
// 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!(
"Trying to feed an already recorded value for query {} key={key:?}:\nold value: {old:?}\nnew value: {value:?}",
stringify!($name),
Expand Down
26 changes: 16 additions & 10 deletions compiler/rustc_query_system/src/query/plumbing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -433,16 +433,22 @@ where
(hasher(&mut hcx, &cached_result), hasher(&mut hcx, &result))
});
let formatter = query.format_value();
debug_assert_eq!(
old_hash,
new_hash,
"Computed query value for {:?}({:?}) is inconsistent with fed value,\n\
computed={:#?}\nfed={:#?}",
query.dep_kind(),
key,
formatter(&result),
formatter(&cached_result),
);
if old_hash != new_hash {
// We have an inconsistency. This can happen if one of the two
// results is tainted by errors. In this case, delay a bug to
// ensure compilation is doomed.
qcx.dep_context().sess().delay_span_bug(
DUMMY_SP,
format!(
"Computed query value for {:?}({:?}) is inconsistent with fed value,\n\
computed={:#?}\nfed={:#?}",
query.dep_kind(),
key,
formatter(&result),
formatter(&cached_result),
),
);
}
}
}
job_owner.complete(cache, result, dep_node_index);
Expand Down
17 changes: 17 additions & 0 deletions tests/incremental/const-generic-type-cycle.rs
Original file line number Diff line number Diff line change
@@ -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 }>;

0 comments on commit 8f2d75d

Please sign in to comment.