Skip to content

Commit

Permalink
Rollup merge of rust-lang#119086 - RossSmyth:query_panics, r=compiler…
Browse files Browse the repository at this point in the history
…-errors

Query panic!() to useful diagnostic

Changes some more ICEs from bare panic!()s

Adds an `expect_job()` helper method as that is a moral equivalent of what was happening at the uses.

re:rust-lang#118955
  • Loading branch information
fmease authored Jan 3, 2024
2 parents e51e98d + 0d421c5 commit 093bd08
Showing 1 changed file with 21 additions and 11 deletions.
32 changes: 21 additions & 11 deletions compiler/rustc_query_system/src/query/plumbing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,18 @@ enum QueryResult {
Poisoned,
}

impl QueryResult {
/// Unwraps the query job expecting that it has started.
fn expect_job(self) -> QueryJob {
match self {
Self::Started(job) => job,
Self::Poisoned => {
panic!("job for query failed to start and was poisoned")
}
}
}
}

impl<K> QueryState<K>
where
K: Eq + Hash + Copy + Debug,
Expand Down Expand Up @@ -169,10 +181,7 @@ where

let job = {
let mut lock = state.active.lock_shard_by_value(&key);
match lock.remove(&key).unwrap() {
QueryResult::Started(job) => job,
QueryResult::Poisoned => panic!(),
}
lock.remove(&key).unwrap().expect_job()
};

job.signal_complete();
Expand All @@ -190,10 +199,8 @@ where
let state = self.state;
let job = {
let mut shard = state.active.lock_shard_by_value(&self.key);
let job = match shard.remove(&self.key).unwrap() {
QueryResult::Started(job) => job,
QueryResult::Poisoned => panic!(),
};
let job = shard.remove(&self.key).unwrap().expect_job();

shard.insert(self.key, QueryResult::Poisoned);
job
};
Expand Down Expand Up @@ -277,11 +284,14 @@ where
// We didn't find the query result in the query cache. Check if it was
// poisoned due to a panic instead.
let lock = query.query_state(qcx).active.get_shard_by_value(&key).lock();

match lock.get(&key) {
// The query we waited on panicked. Continue unwinding here.
Some(QueryResult::Poisoned) => FatalError.raise(),
Some(QueryResult::Poisoned) => {
panic!("query '{}' not cached due to poisoning", query.name())
}
_ => panic!(
"query result must in the cache or the query must be poisoned after a wait"
"query '{}' result must be in the cache or the query must be poisoned after a wait",
query.name()
),
}
})
Expand Down

0 comments on commit 093bd08

Please sign in to comment.