Skip to content

Commit

Permalink
Allow for try_force_from_dep_node to fail
Browse files Browse the repository at this point in the history
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 rust-lang#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
  • Loading branch information
pacak committed Jun 19, 2024
1 parent 3c0f019 commit db5ed4b
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 7 deletions.
18 changes: 11 additions & 7 deletions compiler/rustc_query_system/src/dep_graph/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
40 changes: 40 additions & 0 deletions tests/incremental/unrecoverable_query.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// If it is impossible to find query arguments just from the hash
// compiler should treat the node as red

// In this test prior to fixing compiler was having problems figuring out
// drop impl for T inside of m

//@ revisions:cfail1 cfail2
//@ compile-flags: --crate-type=lib
//@ build-pass

pub trait P {
type A;
}

struct S;

impl P for S {
type A = C;
}

struct T<D: P>(D::A, Z<D>);

struct Z<D: P>(D::A, String);

impl<D: P> T<D> {
pub fn i() -> Self {
loop {}
}
}

enum C {
#[cfg(cfail1)]
Up(()),
#[cfg(cfail2)]
Lorry(()),
}

pub fn m() {
T::<S>::i();
}

0 comments on commit db5ed4b

Please sign in to comment.