Make HandleCycleError
an enum instead of a macro-generated closure
- Add a `HandleCycleError` enum to rustc_query_system, along with a `handle_cycle_error` function - Move `Value` to rustc_query_system, so `handle_cycle_error` can use it - Move the `Value` impls from rustc_query_impl to rustc_middle. This is necessary due to orphan rules.
This commit is contained in:
parent
4e09a13bb8
commit
4856affd90
9 changed files with 86 additions and 43 deletions
|
@ -34,9 +34,6 @@ pub use rustc_query_system::query::{deadlock, QueryContext};
|
|||
mod keys;
|
||||
use keys::Key;
|
||||
|
||||
mod values;
|
||||
use self::values::Value;
|
||||
|
||||
pub use rustc_query_system::query::QueryConfig;
|
||||
pub(crate) use rustc_query_system::query::{QueryDescription, QueryVTable};
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@ use rustc_query_system::query::{
|
|||
force_query, QueryConfig, QueryContext, QueryDescription, QueryJobId, QueryMap,
|
||||
QuerySideEffects, QueryStackFrame,
|
||||
};
|
||||
use rustc_query_system::Value;
|
||||
use std::any::Any;
|
||||
use std::num::NonZeroU64;
|
||||
use thin_vec::ThinVec;
|
||||
|
@ -174,21 +175,17 @@ impl<'tcx> QueryCtxt<'tcx> {
|
|||
}
|
||||
|
||||
macro_rules! handle_cycle_error {
|
||||
([][$tcx: expr, $error:expr]) => {{
|
||||
$error.emit();
|
||||
Value::from_cycle_error($tcx)
|
||||
([]) => {{
|
||||
rustc_query_system::HandleCycleError::Error
|
||||
}};
|
||||
([(fatal_cycle) $($rest:tt)*][$tcx:expr, $error:expr]) => {{
|
||||
$error.emit();
|
||||
$tcx.sess.abort_if_errors();
|
||||
unreachable!()
|
||||
([(fatal_cycle) $($rest:tt)*]) => {{
|
||||
rustc_query_system::HandleCycleError::Fatal
|
||||
}};
|
||||
([(cycle_delay_bug) $($rest:tt)*][$tcx:expr, $error:expr]) => {{
|
||||
$error.delay_as_bug();
|
||||
Value::from_cycle_error($tcx)
|
||||
([(cycle_delay_bug) $($rest:tt)*]) => {{
|
||||
rustc_query_system::HandleCycleError::DelayBug
|
||||
}};
|
||||
([$other:tt $($modifiers:tt)*][$($args:tt)*]) => {
|
||||
handle_cycle_error!([$($modifiers)*][$($args)*])
|
||||
([$other:tt $($modifiers:tt)*]) => {
|
||||
handle_cycle_error!([$($modifiers)*])
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -320,6 +317,7 @@ fn force_from_dep_node<'tcx, Q>(tcx: TyCtxt<'tcx>, dep_node: DepNode) -> bool
|
|||
where
|
||||
Q: QueryDescription<QueryCtxt<'tcx>>,
|
||||
Q::Key: DepNodeParams<TyCtxt<'tcx>>,
|
||||
Q::Value: Value<TyCtxt<'tcx>>,
|
||||
{
|
||||
if let Some(key) = Q::Key::recover(tcx, &dep_node) {
|
||||
#[cfg(debug_assertions)]
|
||||
|
@ -418,7 +416,7 @@ macro_rules! define_queries {
|
|||
depth_limit: depth_limit!([$($modifiers)*]),
|
||||
dep_kind: dep_graph::DepKind::$name,
|
||||
hash_result: hash_result!([$($modifiers)*]),
|
||||
handle_cycle_error: |tcx, mut error| handle_cycle_error!([$($modifiers)*][tcx, error]),
|
||||
handle_cycle_error: handle_cycle_error!([$($modifiers)*]),
|
||||
compute,
|
||||
cache_on_disk,
|
||||
try_load_from_disk: Self::TRY_LOAD_FROM_DISK,
|
||||
|
|
|
@ -1,65 +0,0 @@
|
|||
use super::QueryCtxt;
|
||||
use rustc_middle::ty::{self, AdtSizedConstraint, Ty};
|
||||
|
||||
pub(super) trait Value<'tcx>: Sized {
|
||||
fn from_cycle_error(tcx: QueryCtxt<'tcx>) -> Self;
|
||||
}
|
||||
|
||||
impl<'tcx, T> Value<'tcx> for T {
|
||||
default fn from_cycle_error(tcx: QueryCtxt<'tcx>) -> T {
|
||||
tcx.sess.abort_if_errors();
|
||||
bug!("Value::from_cycle_error called without errors");
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Value<'tcx> for Ty<'_> {
|
||||
fn from_cycle_error(tcx: QueryCtxt<'tcx>) -> Self {
|
||||
// SAFETY: This is never called when `Self` is not `Ty<'tcx>`.
|
||||
// FIXME: Represent the above fact in the trait system somehow.
|
||||
unsafe { std::mem::transmute::<Ty<'tcx>, Ty<'_>>(tcx.ty_error()) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Value<'tcx> for ty::SymbolName<'_> {
|
||||
fn from_cycle_error(tcx: QueryCtxt<'tcx>) -> Self {
|
||||
// SAFETY: This is never called when `Self` is not `SymbolName<'tcx>`.
|
||||
// FIXME: Represent the above fact in the trait system somehow.
|
||||
unsafe {
|
||||
std::mem::transmute::<ty::SymbolName<'tcx>, ty::SymbolName<'_>>(ty::SymbolName::new(
|
||||
*tcx, "<error>",
|
||||
))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Value<'tcx> for AdtSizedConstraint<'_> {
|
||||
fn from_cycle_error(tcx: QueryCtxt<'tcx>) -> Self {
|
||||
// SAFETY: This is never called when `Self` is not `AdtSizedConstraint<'tcx>`.
|
||||
// FIXME: Represent the above fact in the trait system somehow.
|
||||
unsafe {
|
||||
std::mem::transmute::<AdtSizedConstraint<'tcx>, AdtSizedConstraint<'_>>(
|
||||
AdtSizedConstraint(tcx.intern_type_list(&[tcx.ty_error()])),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Value<'tcx> for ty::Binder<'_, ty::FnSig<'_>> {
|
||||
fn from_cycle_error(tcx: QueryCtxt<'tcx>) -> Self {
|
||||
let err = tcx.ty_error();
|
||||
// FIXME(compiler-errors): It would be nice if we could get the
|
||||
// query key, so we could at least generate a fn signature that
|
||||
// has the right arity.
|
||||
let fn_sig = ty::Binder::dummy(tcx.mk_fn_sig(
|
||||
[].into_iter(),
|
||||
err,
|
||||
false,
|
||||
rustc_hir::Unsafety::Normal,
|
||||
rustc_target::spec::abi::Abi::Rust,
|
||||
));
|
||||
|
||||
// SAFETY: This is never called when `Self` is not `ty::Binder<'tcx, ty::FnSig<'tcx>>`.
|
||||
// FIXME: Represent the above fact in the trait system somehow.
|
||||
unsafe { std::mem::transmute::<ty::PolyFnSig<'tcx>, ty::Binder<'_, ty::FnSig<'_>>>(fn_sig) }
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue