Refactor ConstVariableOrigin into ConstVariableOrigin and ConstVariableOriginKind

This commit is contained in:
varkor 2019-05-31 22:52:35 +01:00
parent 4dcc49c685
commit 8577bb49bf
7 changed files with 54 additions and 20 deletions

View file

@ -22,7 +22,7 @@
//! [c]: https://rust-lang.github.io/rustc-guide/traits/canonicalization.html //! [c]: https://rust-lang.github.io/rustc-guide/traits/canonicalization.html
use crate::infer::{InferCtxt, RegionVariableOrigin, TypeVariableOrigin, TypeVariableOriginKind}; use crate::infer::{InferCtxt, RegionVariableOrigin, TypeVariableOrigin, TypeVariableOriginKind};
use crate::infer::ConstVariableOrigin; use crate::infer::{ConstVariableOrigin, ConstVariableOriginKind};
use crate::mir::interpret::ConstValue; use crate::mir::interpret::ConstValue;
use rustc_data_structures::indexed_vec::IndexVec; use rustc_data_structures::indexed_vec::IndexVec;
use rustc_macros::HashStable; use rustc_macros::HashStable;
@ -407,10 +407,16 @@ impl<'cx, 'gcx, 'tcx> InferCtxt<'cx, 'gcx, 'tcx> {
CanonicalVarKind::Const(ui) => { CanonicalVarKind::Const(ui) => {
self.next_const_var_in_universe( self.next_const_var_in_universe(
self.next_ty_var_in_universe( self.next_ty_var_in_universe(
TypeVariableOrigin::MiscVariable(span), TypeVariableOrigin {
kind: TypeVariableOriginKind::MiscVariable,
span,
},
universe_map(ui), universe_map(ui),
), ),
ConstVariableOrigin::MiscVariable(span), ConstVariableOrigin {
kind: ConstVariableOriginKind::MiscVariable,
span,
},
universe_map(ui), universe_map(ui),
).into() ).into()
} }

View file

@ -28,7 +28,8 @@ use super::{InferCtxt, MiscVariable, TypeTrace};
use super::lub::Lub; use super::lub::Lub;
use super::sub::Sub; use super::sub::Sub;
use super::type_variable::TypeVariableValue; use super::type_variable::TypeVariableValue;
use super::unify_key::{ConstVarValue, ConstVariableValue, ConstVariableOrigin}; use super::unify_key::{ConstVarValue, ConstVariableValue};
use super::unify_key::{ConstVariableOrigin, ConstVariableOriginKind};
use crate::hir::def_id::DefId; use crate::hir::def_id::DefId;
use crate::mir::interpret::ConstValue; use crate::mir::interpret::ConstValue;
@ -165,7 +166,10 @@ impl<'infcx, 'gcx, 'tcx> InferCtxt<'infcx, 'gcx, 'tcx> {
self.const_unification_table self.const_unification_table
.borrow_mut() .borrow_mut()
.unify_var_value(vid, ConstVarValue { .unify_var_value(vid, ConstVarValue {
origin: ConstVariableOrigin::ConstInference(DUMMY_SP), origin: ConstVariableOrigin {
kind: ConstVariableOriginKind::ConstInference,
span: DUMMY_SP,
},
val: ConstVariableValue::Known { value }, val: ConstVariableValue::Known { value },
}) })
.map_err(|e| const_unification_error(vid_is_expected, e))?; .map_err(|e| const_unification_error(vid_is_expected, e))?;

View file

@ -40,7 +40,7 @@ use self::outlives::env::OutlivesEnvironment;
use self::region_constraints::{GenericKind, RegionConstraintData, VarInfos, VerifyBound}; use self::region_constraints::{GenericKind, RegionConstraintData, VarInfos, VerifyBound};
use self::region_constraints::{RegionConstraintCollector, RegionSnapshot}; use self::region_constraints::{RegionConstraintCollector, RegionSnapshot};
use self::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; use self::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
use self::unify_key::{ToType, ConstVariableOrigin}; use self::unify_key::{ToType, ConstVariableOrigin, ConstVariableOriginKind};
pub mod at; pub mod at;
pub mod canonical; pub mod canonical;
@ -1119,7 +1119,10 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
self.tcx.mk_ty_var(ty_var_id).into() self.tcx.mk_ty_var(ty_var_id).into()
} }
GenericParamDefKind::Const { .. } => { GenericParamDefKind::Const { .. } => {
let origin = ConstVariableOrigin::ConstParameterDefinition(span, param.name); let origin = ConstVariableOrigin {
kind: ConstVariableOriginKind::ConstParameterDefinition(param.name),
span,
};
let const_var_id = let const_var_id =
self.const_unification_table self.const_unification_table
.borrow_mut() .borrow_mut()
@ -1421,7 +1424,10 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
span, span,
}) })
}; };
let fld_c = |_, ty| self.next_const_var(ty, ConstVariableOrigin::MiscVariable(span)); let fld_c = |_, ty| self.next_const_var(ty, ConstVariableOrigin {
kind: ConstVariableOriginKind:: MiscVariable,
span,
});
self.tcx.replace_bound_vars(value, fld_r, fld_t, fld_c) self.tcx.replace_bound_vars(value, fld_r, fld_t, fld_c)
} }

View file

@ -1,4 +1,5 @@
use super::{InferCtxt, FixupError, FixupResult, Span, type_variable::TypeVariableOrigin}; use super::{InferCtxt, FixupError, FixupResult, Span};
use super::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
use crate::mir::interpret::ConstValue; use crate::mir::interpret::ConstValue;
use crate::ty::{self, Ty, Const, TyCtxt, TypeFoldable, InferConst, TypeFlags}; use crate::ty::{self, Ty, Const, TyCtxt, TypeFoldable, InferConst, TypeFlags};
use crate::ty::fold::{TypeFolder, TypeVisitor}; use crate::ty::fold::{TypeFolder, TypeVisitor};
@ -123,8 +124,10 @@ impl<'a, 'gcx, 'tcx> TypeVisitor<'tcx> for UnresolvedTypeFinder<'a, 'gcx, 'tcx>
let ty_var_span = let ty_var_span =
if let ty::TyVar(ty_vid) = infer_ty { if let ty::TyVar(ty_vid) = infer_ty {
let ty_vars = self.infcx.type_variables.borrow(); let ty_vars = self.infcx.type_variables.borrow();
if let TypeVariableOrigin::TypeParameterDefinition(span, _name) if let TypeVariableOrigin {
= *ty_vars.var_origin(ty_vid) kind: TypeVariableOriginKind::TypeParameterDefinition(_),
span,
} = *ty_vars.var_origin(ty_vid)
{ {
Some(span) Some(span)
} else { } else {

View file

@ -79,13 +79,19 @@ impl ToType for FloatVarValue {
// Generic consts. // Generic consts.
#[derive(Copy, Clone, Debug)]
pub struct ConstVariableOrigin {
pub kind: ConstVariableOriginKind,
pub span: Span,
}
/// Reasons to create a const inference variable /// Reasons to create a const inference variable
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug)]
pub enum ConstVariableOrigin { pub enum ConstVariableOriginKind {
MiscVariable(Span), MiscVariable,
ConstInference(Span), ConstInference,
ConstParameterDefinition(Span, InternedString), ConstParameterDefinition(InternedString),
SubstitutionPlaceholder(Span), SubstitutionPlaceholder,
} }
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug)]
@ -159,7 +165,10 @@ impl<'tcx> UnifyValue for ConstVarValue<'tcx> {
}?; }?;
Ok(ConstVarValue { Ok(ConstVarValue {
origin: ConstVariableOrigin::ConstInference(DUMMY_SP), origin: ConstVariableOrigin {
kind: ConstVariableOriginKind::ConstInference,
span: DUMMY_SP,
},
val, val,
}) })
} }

View file

@ -1009,7 +1009,10 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
// ...but otherwise we want to use any supertype of the // ...but otherwise we want to use any supertype of the
// discriminant. This is sort of a workaround, see note (*) in // discriminant. This is sort of a workaround, see note (*) in
// `check_pat` for some details. // `check_pat` for some details.
let discrim_ty = self.next_ty_var(TypeVariableOrigin::TypeInference(discrim.span)); let discrim_ty = self.next_ty_var(TypeVariableOrigin {
kind: TypeVariableOriginKind::TypeInference,
span: discrim.span,
});
self.check_expr_has_type_or_error(discrim, discrim_ty); self.check_expr_has_type_or_error(discrim, discrim_ty);
discrim_ty discrim_ty
} }

View file

@ -21,7 +21,7 @@ use rustc::traits::query::method_autoderef::{MethodAutoderefBadTy};
use rustc::ty::{self, ParamEnvAnd, Ty, TyCtxt, ToPolyTraitRef, ToPredicate, TraitRef, TypeFoldable}; use rustc::ty::{self, ParamEnvAnd, Ty, TyCtxt, ToPolyTraitRef, ToPredicate, TraitRef, TypeFoldable};
use rustc::ty::GenericParamDefKind; use rustc::ty::GenericParamDefKind;
use rustc::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; use rustc::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
use rustc::infer::unify_key::ConstVariableOrigin; use rustc::infer::unify_key::{ConstVariableOrigin, ConstVariableOriginKind};
use rustc::util::nodemap::FxHashSet; use rustc::util::nodemap::FxHashSet;
use rustc::infer::{self, InferOk}; use rustc::infer::{self, InferOk};
use rustc::infer::canonical::{Canonical, QueryResponse}; use rustc::infer::canonical::{Canonical, QueryResponse};
@ -1580,7 +1580,10 @@ impl<'a, 'gcx, 'tcx> ProbeContext<'a, 'gcx, 'tcx> {
} }
GenericParamDefKind::Const { .. } => { GenericParamDefKind::Const { .. } => {
let span = self.tcx.def_span(def_id); let span = self.tcx.def_span(def_id);
let origin = ConstVariableOrigin::SubstitutionPlaceholder(span); let origin = ConstVariableOrigin {
kind: ConstVariableOriginKind::SubstitutionPlaceholder,
span,
};
self.next_const_var(self.tcx.type_of(param.def_id), origin).into() self.next_const_var(self.tcx.type_of(param.def_id), origin).into()
} }
} }