diff options
| author | Ross Smyth <rsmyth@electrocraft.com> | 2023-12-18 10:48:21 -0500 |
|---|---|---|
| committer | Ross Smyth <rsmyth@electrocraft.com> | 2024-01-03 09:51:58 -0500 |
| commit | 0d421c5acec8719875d8261838cb6d047fe9b23b (patch) | |
| tree | f1d38e5dc47d53d67e8eb86496cdd92b70df86ed | |
| parent | 3562c535fefe00174cc7fdcace387c9a7f50075e (diff) | |
| download | rust-0d421c5acec8719875d8261838cb6d047fe9b23b.tar.gz rust-0d421c5acec8719875d8261838cb6d047fe9b23b.zip | |
Add useful panic messages if queries fail to start
| -rw-r--r-- | compiler/rustc_query_system/src/query/plumbing.rs | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/compiler/rustc_query_system/src/query/plumbing.rs b/compiler/rustc_query_system/src/query/plumbing.rs index 41638b38c74..fb11820407b 100644 --- a/compiler/rustc_query_system/src/query/plumbing.rs +++ b/compiler/rustc_query_system/src/query/plumbing.rs @@ -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, @@ -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(); @@ -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 }; @@ -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() ), } }) |
