get rid of visit_constant in thir visitor
This commit is contained in:
parent
14e3d038c0
commit
c3491378e3
5 changed files with 27 additions and 24 deletions
|
@ -1,7 +1,6 @@
|
|||
use super::{
|
||||
Arm, Block, Expr, ExprKind, Guard, InlineAsmOperand, Pat, PatKind, Stmt, StmtKind, Thir,
|
||||
};
|
||||
use crate::mir::ConstantKind;
|
||||
|
||||
pub trait Visitor<'a, 'tcx: 'a>: Sized {
|
||||
fn thir(&self) -> &'a Thir<'tcx>;
|
||||
|
@ -26,7 +25,14 @@ pub trait Visitor<'a, 'tcx: 'a>: Sized {
|
|||
walk_pat(self, pat);
|
||||
}
|
||||
|
||||
fn visit_constant(&mut self, _constant: ConstantKind<'tcx>) {}
|
||||
// Note: We don't have visitors for `ty::Const` and `mir::ConstantKind`
|
||||
// (even though these types occur in THIR) for consistency and to reduce confusion,
|
||||
// since the lazy creation of constants during thir construction causes most
|
||||
// 'constants' to not be of type `ty::Const` or `mir::ConstantKind` at that
|
||||
// stage (they are mostly still identified by `DefId` or `hir::Lit`, see
|
||||
// the variants `Literal`, `NonHirLiteral` and `NamedConst` in `thir::ExprKind`).
|
||||
// You have to manually visit `ty::Const` and `mir::ConstantKind` through the
|
||||
// other `visit*` functions.
|
||||
}
|
||||
|
||||
pub fn walk_expr<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, expr: &Expr<'tcx>) {
|
||||
|
|
|
@ -662,8 +662,8 @@ impl<'tcx> TypeFolder<'tcx> for OpaqueTypeExpander<'tcx> {
|
|||
impl<'tcx> Ty<'tcx> {
|
||||
/// Returns the maximum value for the given numeric type (including `char`s)
|
||||
/// or returns `None` if the type is not numeric.
|
||||
pub fn numeric_max_val(self, tcx: TyCtxt<'tcx>) -> Option<u128> {
|
||||
match self.kind() {
|
||||
pub fn numeric_max_val(self, tcx: TyCtxt<'tcx>) -> Option<Const<'tcx>> {
|
||||
let val = match self.kind() {
|
||||
ty::Int(_) | ty::Uint(_) => {
|
||||
let (size, signed) = int_size_and_signed(tcx, self);
|
||||
let val =
|
||||
|
@ -676,13 +676,14 @@ impl<'tcx> Ty<'tcx> {
|
|||
ty::FloatTy::F64 => rustc_apfloat::ieee::Double::INFINITY.to_bits(),
|
||||
}),
|
||||
_ => None,
|
||||
}
|
||||
};
|
||||
val.map(|v| Const::from_bits(tcx, v, ty::ParamEnv::empty().and(self)))
|
||||
}
|
||||
|
||||
/// Returns the minimum value for the given numeric type (including `char`s)
|
||||
/// or returns `None` if the type is not numeric.
|
||||
pub fn numeric_min_val(self, tcx: TyCtxt<'tcx>) -> Option<u128> {
|
||||
match self.kind() {
|
||||
pub fn numeric_min_val(self, tcx: TyCtxt<'tcx>) -> Option<Const<'tcx>> {
|
||||
let val = match self.kind() {
|
||||
ty::Int(_) | ty::Uint(_) => {
|
||||
let (size, signed) = int_size_and_signed(tcx, self);
|
||||
let val = if signed { size.truncate(size.signed_int_min() as u128) } else { 0 };
|
||||
|
@ -694,7 +695,8 @@ impl<'tcx> Ty<'tcx> {
|
|||
ty::FloatTy::F64 => (-::rustc_apfloat::ieee::Double::INFINITY).to_bits(),
|
||||
}),
|
||||
_ => None,
|
||||
}
|
||||
};
|
||||
val.map(|v| Const::from_bits(tcx, v, ty::ParamEnv::empty().and(self)))
|
||||
}
|
||||
|
||||
/// Checks whether values of this type `T` are *moved* or *copied*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue