Replace const_error
methods with Const::new_error
This commit is contained in:
parent
ddbc774e74
commit
d30f56dbf2
15 changed files with 66 additions and 59 deletions
|
@ -528,13 +528,13 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
|
|||
let reported = err.emit();
|
||||
term = match def_kind {
|
||||
hir::def::DefKind::AssocTy => tcx.ty_error(reported).into(),
|
||||
hir::def::DefKind::AssocConst => tcx
|
||||
.const_error(
|
||||
tcx.type_of(assoc_item_def_id)
|
||||
.subst(tcx, projection_ty.skip_binder().substs),
|
||||
reported,
|
||||
)
|
||||
.into(),
|
||||
hir::def::DefKind::AssocConst => ty::Const::new_error(
|
||||
tcx,
|
||||
reported,
|
||||
tcx.type_of(assoc_item_def_id)
|
||||
.subst(tcx, projection_ty.skip_binder().substs),
|
||||
)
|
||||
.into(),
|
||||
_ => unreachable!(),
|
||||
};
|
||||
}
|
||||
|
|
|
@ -482,7 +482,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
self.astconv.ct_infer(ty, Some(param), inf.span).into()
|
||||
} else {
|
||||
self.inferred_params.push(inf.span);
|
||||
tcx.const_error_misc(ty).into()
|
||||
ty::Const::new_misc_error(tcx, ty).into()
|
||||
}
|
||||
}
|
||||
_ => unreachable!(),
|
||||
|
@ -537,7 +537,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
.no_bound_vars()
|
||||
.expect("const parameter types cannot be generic");
|
||||
if let Err(guar) = ty.error_reported() {
|
||||
return tcx.const_error(ty, guar).into();
|
||||
return ty::Const::new_error(tcx, guar, ty).into();
|
||||
}
|
||||
if !infer_args && has_default {
|
||||
tcx.const_param_default(param.def_id).subst(tcx, substs.unwrap()).into()
|
||||
|
@ -546,7 +546,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
self.astconv.ct_infer(ty, Some(param), self.span).into()
|
||||
} else {
|
||||
// We've already errored above about the mismatch.
|
||||
tcx.const_error_misc(ty).into()
|
||||
ty::Const::new_misc_error(tcx, ty).into()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -390,7 +390,7 @@ impl<'tcx> AstConv<'tcx> for ItemCtxt<'tcx> {
|
|||
// left alone.
|
||||
r => bug!("unexpected region: {r:?}"),
|
||||
});
|
||||
self.tcx().const_error_with_message(ty, span, "bad placeholder constant")
|
||||
ty::Const::new_error_with_message(self.tcx(), ty, span, "bad placeholder constant")
|
||||
}
|
||||
|
||||
fn projected_ty_from_poly_trait_ref(
|
||||
|
|
|
@ -840,7 +840,7 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Resolver<'cx, 'tcx> {
|
|||
debug!("Resolver::fold_const: input const `{:?}` not fully resolvable", ct);
|
||||
let e = self.report_error(ct);
|
||||
self.replaced_with_error = Some(e);
|
||||
self.fcx.tcx.const_error(ct.ty(), e)
|
||||
ty::Const::new_error(self.fcx.tcx, e, ct.ty())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -189,11 +189,11 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
// HACK: equating both sides with `[const error]` eagerly prevents us
|
||||
// from leaving unconstrained inference vars during things like impl
|
||||
// matching in the solver.
|
||||
let a_error = self.tcx.const_error(a.ty(), guar);
|
||||
let a_error = ty::Const::new_error(self.tcx, guar, a.ty());
|
||||
if let ty::ConstKind::Infer(InferConst::Var(vid)) = a.kind() {
|
||||
return self.unify_const_variable(vid, a_error, relation.param_env());
|
||||
}
|
||||
let b_error = self.tcx.const_error(b.ty(), guar);
|
||||
let b_error = ty::Const::new_error(self.tcx, guar, b.ty());
|
||||
if let ty::ConstKind::Infer(InferConst::Var(vid)) = b.kind() {
|
||||
return self.unify_const_variable(vid, b_error, relation.param_env());
|
||||
}
|
||||
|
|
|
@ -2332,7 +2332,7 @@ impl<'tcx> ConstantKind<'tcx> {
|
|||
if let Some(val) = c.kind().try_eval_for_mir(tcx, param_env) {
|
||||
match val {
|
||||
Ok(val) => Self::Val(val, c.ty()),
|
||||
Err(guar) => Self::Ty(tcx.const_error(self.ty(), guar)),
|
||||
Err(guar) => Self::Ty(ty::Const::new_error(tcx, guar, self.ty())),
|
||||
}
|
||||
} else {
|
||||
self
|
||||
|
@ -2344,7 +2344,9 @@ impl<'tcx> ConstantKind<'tcx> {
|
|||
match tcx.const_eval_resolve(param_env, uneval, None) {
|
||||
Ok(val) => Self::Val(val, ty),
|
||||
Err(ErrorHandled::TooGeneric) => self,
|
||||
Err(ErrorHandled::Reported(guar)) => Self::Ty(tcx.const_error(ty, guar.into())),
|
||||
Err(ErrorHandled::Reported(guar)) => {
|
||||
Self::Ty(ty::Const::new_error(tcx, guar.into(), ty))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
fn fold_const(&mut self, c: Const<'tcx>) -> Const<'tcx> {
|
||||
let ct = match c.kind() {
|
||||
ty::ConstKind::Unevaluated(uv) => match self.tcx.thir_abstract_const(uv.def) {
|
||||
Err(e) => self.tcx.const_error(c.ty(), e),
|
||||
Err(e) => ty::Const::new_error(self.tcx, e, c.ty()),
|
||||
Ok(Some(bac)) => {
|
||||
let substs = self.tcx.erase_regions(uv.substs);
|
||||
let bac = bac.subst(self.tcx, substs);
|
||||
|
|
|
@ -2,6 +2,7 @@ use crate::middle::resolve_bound_vars as rbv;
|
|||
use crate::mir::interpret::LitToConstInput;
|
||||
use crate::ty::{self, InternalSubsts, ParamEnv, ParamEnvAnd, Ty, TyCtxt};
|
||||
use rustc_data_structures::intern::Interned;
|
||||
use rustc_error_messages::MultiSpan;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::LocalDefId;
|
||||
|
@ -13,6 +14,7 @@ mod valtree;
|
|||
|
||||
pub use int::*;
|
||||
pub use kind::*;
|
||||
use rustc_span::DUMMY_SP;
|
||||
pub use valtree::*;
|
||||
|
||||
/// Use this rather than `ConstData`, whenever possible.
|
||||
|
@ -104,6 +106,34 @@ impl<'tcx> Const<'tcx> {
|
|||
Const::new(tcx, ty::ConstKind::Expr(expr), ty)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn new_error(tcx: TyCtxt<'tcx>, e: ty::ErrorGuaranteed, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
Const::new(tcx, ty::ConstKind::Error(e), ty)
|
||||
}
|
||||
|
||||
/// Like [TyCtxt::ty_error] but for constants.
|
||||
#[track_caller]
|
||||
pub fn new_misc_error(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
Const::new_error_with_message(
|
||||
tcx,
|
||||
ty,
|
||||
DUMMY_SP,
|
||||
"ty::ConstKind::Error constructed but no error reported",
|
||||
)
|
||||
}
|
||||
|
||||
/// Like [TyCtxt::ty_error_with_message] but for constants.
|
||||
#[track_caller]
|
||||
pub fn new_error_with_message<S: Into<MultiSpan>>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
span: S,
|
||||
msg: &'static str,
|
||||
) -> Const<'tcx> {
|
||||
let reported = tcx.sess.delay_span_bug(span, msg);
|
||||
Const::new_error(tcx, reported, ty)
|
||||
}
|
||||
|
||||
/// Literals and const generic parameters are eagerly converted to a constant, everything else
|
||||
/// becomes `Unevaluated`.
|
||||
#[instrument(skip(tcx), level = "debug")]
|
||||
|
@ -200,7 +230,9 @@ impl<'tcx> Const<'tcx> {
|
|||
param_ty,
|
||||
))
|
||||
}
|
||||
Some(rbv::ResolvedArg::Error(guar)) => Some(tcx.const_error(param_ty, guar)),
|
||||
Some(rbv::ResolvedArg::Error(guar)) => {
|
||||
Some(ty::Const::new_error(tcx, guar, param_ty))
|
||||
}
|
||||
arg => bug!("unexpected bound var resolution for {:?}: {arg:?}", expr.hir_id),
|
||||
}
|
||||
}
|
||||
|
@ -285,7 +317,7 @@ impl<'tcx> Const<'tcx> {
|
|||
if let Some(val) = self.kind().try_eval_for_typeck(tcx, param_env) {
|
||||
match val {
|
||||
Ok(val) => ty::Const::new_value(tcx, val, self.ty()),
|
||||
Err(guar) => tcx.const_error(self.ty(), guar),
|
||||
Err(guar) => ty::Const::new_error(tcx, guar, self.ty()),
|
||||
}
|
||||
} else {
|
||||
// Either the constant isn't evaluatable or ValTree creation failed.
|
||||
|
|
|
@ -733,34 +733,6 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
self.mk_ty_from_kind(Error(reported))
|
||||
}
|
||||
|
||||
/// Like [TyCtxt::ty_error] but for constants, with current `ErrorGuaranteed`
|
||||
#[track_caller]
|
||||
pub fn const_error(self, ty: Ty<'tcx>, reported: ErrorGuaranteed) -> Const<'tcx> {
|
||||
self.mk_ct_from_kind(ty::ConstKind::Error(reported), ty)
|
||||
}
|
||||
|
||||
/// Like [TyCtxt::ty_error] but for constants.
|
||||
#[track_caller]
|
||||
pub fn const_error_misc(self, ty: Ty<'tcx>) -> Const<'tcx> {
|
||||
self.const_error_with_message(
|
||||
ty,
|
||||
DUMMY_SP,
|
||||
"ty::ConstKind::Error constructed but no error reported",
|
||||
)
|
||||
}
|
||||
|
||||
/// Like [TyCtxt::ty_error_with_message] but for constants.
|
||||
#[track_caller]
|
||||
pub fn const_error_with_message<S: Into<MultiSpan>>(
|
||||
self,
|
||||
ty: Ty<'tcx>,
|
||||
span: S,
|
||||
msg: &'static str,
|
||||
) -> Const<'tcx> {
|
||||
let reported = self.sess.delay_span_bug(span, msg);
|
||||
self.const_error(ty, reported)
|
||||
}
|
||||
|
||||
pub fn consider_optimizing<T: Fn() -> String>(self, msg: T) -> bool {
|
||||
self.sess.consider_optimizing(|| self.crate_name(LOCAL_CRATE), msg)
|
||||
}
|
||||
|
|
|
@ -102,9 +102,11 @@ impl GenericParamDef {
|
|||
match &self.kind {
|
||||
ty::GenericParamDefKind::Lifetime => ty::Region::new_error_misc(tcx).into(),
|
||||
ty::GenericParamDefKind::Type { .. } => tcx.ty_error_misc().into(),
|
||||
ty::GenericParamDefKind::Const { .. } => {
|
||||
tcx.const_error_misc(tcx.type_of(self.def_id).subst(tcx, preceding_substs)).into()
|
||||
}
|
||||
ty::GenericParamDefKind::Const { .. } => ty::Const::new_misc_error(
|
||||
tcx,
|
||||
tcx.type_of(self.def_id).subst(tcx, preceding_substs),
|
||||
)
|
||||
.into(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -216,7 +216,7 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for ReverseMapper<'tcx> {
|
|||
})
|
||||
.emit_unless(self.ignore_errors);
|
||||
|
||||
self.interner().const_error(ct.ty(), guar)
|
||||
ty::Const::new_error(self.tcx, guar, ct.ty())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@ pub fn as_constant_inner<'tcx>(
|
|||
match lit_to_mir_constant(tcx, LitToConstInput { lit: &lit.node, ty, neg }) {
|
||||
Ok(c) => c,
|
||||
Err(LitToConstError::Reported(guar)) => {
|
||||
ConstantKind::Ty(tcx.const_error(ty, guar))
|
||||
ConstantKind::Ty(ty::Const::new_error(tcx, guar, ty))
|
||||
}
|
||||
Err(LitToConstError::TypeError) => {
|
||||
bug!("encountered type error in `lit_to_mir_constant`")
|
||||
|
|
|
@ -915,7 +915,7 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
|
|||
use rustc_middle::mir::interpret::ErrorHandled;
|
||||
match self.infcx.try_const_eval_resolve(param_env, unevaluated, ty, None) {
|
||||
Ok(ct) => Some(ct),
|
||||
Err(ErrorHandled::Reported(e)) => Some(self.tcx().const_error(ty, e.into())),
|
||||
Err(ErrorHandled::Reported(e)) => Some(ty::Const::new_error(self.tcx(), e.into(), ty)),
|
||||
Err(ErrorHandled::TooGeneric) => None,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -186,11 +186,10 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> {
|
|||
"missing value for assoc item in impl",
|
||||
);
|
||||
let error_term = match assoc_def.item.kind {
|
||||
ty::AssocKind::Const => tcx
|
||||
.const_error(
|
||||
tcx.type_of(goal.predicate.def_id())
|
||||
.subst(tcx, goal.predicate.projection_ty.substs),
|
||||
guar,
|
||||
ty::AssocKind::Const => ty::Const::new_error(tcx,
|
||||
guar,
|
||||
tcx.type_of(goal.predicate.def_id())
|
||||
.subst(tcx, goal.predicate.projection_ty.substs),
|
||||
)
|
||||
.into(),
|
||||
ty::AssocKind::Type => tcx.ty_error(guar).into(),
|
||||
|
|
|
@ -119,7 +119,7 @@ fn recurse_build<'tcx>(
|
|||
let sp = node.span;
|
||||
match tcx.at(sp).lit_to_const(LitToConstInput { lit: &lit.node, ty: node.ty, neg }) {
|
||||
Ok(c) => c,
|
||||
Err(LitToConstError::Reported(guar)) => tcx.const_error(node.ty, guar),
|
||||
Err(LitToConstError::Reported(guar)) => ty::Const::new_error(tcx, guar, node.ty),
|
||||
Err(LitToConstError::TypeError) => {
|
||||
bug!("encountered type error in lit_to_const")
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue