diff options
| author | Michael Baikov <manpacket@gmail.com> | 2024-06-13 08:27:21 -0400 |
|---|---|---|
| committer | Michael Baikov <manpacket@gmail.com> | 2024-06-19 07:21:41 -0400 |
| commit | db5ed4bd799cda1217ec6431ffa56cecd09ef6e9 (patch) | |
| tree | 3d95e8d876a4389bfcb9e8ae07a95ca1be53dffa /compiler/rustc_query_system | |
| parent | 3c0f019b3c56c1a0e6e0cbed6f8a8b0b245e5665 (diff) | |
| download | rust-db5ed4bd799cda1217ec6431ffa56cecd09ef6e9.tar.gz rust-db5ed4bd799cda1217ec6431ffa56cecd09ef6e9.zip | |
Allow for try_force_from_dep_node to fail
The way it is implemented currently try_force_from_dep_node returns true as long as there's a function to force the query. It wasn't this way from the beginning, earlier version was producing forcing result and it was changed in https://github.com/rust-lang/rust/pull/89978, I couldn't find any comments addressing this change. One way it can fail is by failing to recover the query in DepNodeParams::recover - when we are trying to query something that no longer exists in the current environment
Diffstat (limited to 'compiler/rustc_query_system')
| -rw-r--r-- | compiler/rustc_query_system/src/dep_graph/mod.rs | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/compiler/rustc_query_system/src/dep_graph/mod.rs b/compiler/rustc_query_system/src/dep_graph/mod.rs index cbd80295887..cfb25ec905f 100644 --- a/compiler/rustc_query_system/src/dep_graph/mod.rs +++ b/compiler/rustc_query_system/src/dep_graph/mod.rs @@ -51,20 +51,24 @@ pub trait DepContext: Copy { } /// Try to force a dep node to execute and see if it's green. + /// + /// Returns true if the query has actually been forced. It is valid that a query + /// fails to be forced, e.g. when the query key cannot be reconstructed from the + /// dep-node or when the query kind outright does not support it. #[inline] #[instrument(skip(self, frame), level = "debug")] fn try_force_from_dep_node(self, dep_node: DepNode, frame: Option<&MarkFrame<'_>>) -> bool { let cb = self.dep_kind_info(dep_node.kind); if let Some(f) = cb.force_from_dep_node { - if let Err(value) = panic::catch_unwind(panic::AssertUnwindSafe(|| { - f(self, dep_node); - })) { - if !value.is::<rustc_errors::FatalErrorMarker>() { - print_markframe_trace(self.dep_graph(), frame); + match panic::catch_unwind(panic::AssertUnwindSafe(|| f(self, dep_node))) { + Err(value) => { + if !value.is::<rustc_errors::FatalErrorMarker>() { + print_markframe_trace(self.dep_graph(), frame); + } + panic::resume_unwind(value) } - panic::resume_unwind(value) + Ok(query_has_been_forced) => query_has_been_forced, } - true } else { false } |
