diff options
| author | lcnr <rust@lcnr.de> | 2021-08-02 08:47:15 +0200 |
|---|---|---|
| committer | lcnr <rust@lcnr.de> | 2021-08-26 11:00:30 +0200 |
| commit | bc0156baceed60a4dbfd063554e66bc69b3b0bd4 (patch) | |
| tree | 0c075dbd7fe5e608b61f71997902d5c919d36704 /compiler/rustc_middle/src | |
| parent | 283e0e670b7b6f925d5973f2b2b373304b17b114 (diff) | |
| download | rust-bc0156baceed60a4dbfd063554e66bc69b3b0bd4.tar.gz rust-bc0156baceed60a4dbfd063554e66bc69b3b0bd4.zip | |
shrink `ty::PredicateKind` again
Diffstat (limited to 'compiler/rustc_middle/src')
| -rw-r--r-- | compiler/rustc_middle/src/query/mod.rs | 2 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/consts/kind.rs | 29 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/flags.rs | 2 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/mod.rs | 4 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/relate.rs | 2 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/structural_impls.rs | 25 |
6 files changed, 54 insertions, 10 deletions
diff --git a/compiler/rustc_middle/src/query/mod.rs b/compiler/rustc_middle/src/query/mod.rs index 9b3de6710ec..f8e0d910a54 100644 --- a/compiler/rustc_middle/src/query/mod.rs +++ b/compiler/rustc_middle/src/query/mod.rs @@ -303,7 +303,7 @@ rustc_queries! { } query try_unify_abstract_consts(key: ( - ty::Unevaluated<'tcx>, ty::Unevaluated<'tcx> + ty::Unevaluated<'tcx, ()>, ty::Unevaluated<'tcx, ()> )) -> bool { desc { |tcx| "trying to unify the generic constants {} and {}", diff --git a/compiler/rustc_middle/src/ty/consts/kind.rs b/compiler/rustc_middle/src/ty/consts/kind.rs index b1f6a612776..e6a6b7f8556 100644 --- a/compiler/rustc_middle/src/ty/consts/kind.rs +++ b/compiler/rustc_middle/src/ty/consts/kind.rs @@ -1,4 +1,5 @@ use std::convert::TryInto; +use std::fmt; use crate::mir::interpret::{AllocId, ConstValue, Scalar}; use crate::mir::Promoted; @@ -20,20 +21,38 @@ use super::ScalarInt; /// so refer to that check for more info. #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord, TyEncodable, TyDecodable, Lift)] #[derive(Hash, HashStable)] -pub struct Unevaluated<'tcx> { +pub struct Unevaluated<'tcx, P = Option<Promoted>> { pub def: ty::WithOptConstParam<DefId>, pub substs_: Option<SubstsRef<'tcx>>, - pub promoted: Option<Promoted>, + pub promoted: P, } impl<'tcx> Unevaluated<'tcx> { - pub fn new(def: ty::WithOptConstParam<DefId>, substs: SubstsRef<'tcx>) -> Unevaluated<'tcx> { - Unevaluated { def, substs_: Some(substs), promoted: None } + pub fn shrink(self) -> Unevaluated<'tcx, ()> { + debug_assert_eq!(self.promoted, None); + Unevaluated { def: self.def, substs_: self.substs_, promoted: () } } +} + +impl<'tcx> Unevaluated<'tcx, ()> { + pub fn expand(self) -> Unevaluated<'tcx> { + Unevaluated { def: self.def, substs_: self.substs_, promoted: None } + } +} + +impl<'tcx, P: Default> Unevaluated<'tcx, P> { + pub fn new(def: ty::WithOptConstParam<DefId>, substs: SubstsRef<'tcx>) -> Unevaluated<'tcx, P> { + Unevaluated { def, substs_: Some(substs), promoted: Default::default() } + } +} +impl<'tcx, P: Default + PartialEq + fmt::Debug> Unevaluated<'tcx, P> { pub fn substs(self, tcx: TyCtxt<'tcx>) -> SubstsRef<'tcx> { self.substs_.unwrap_or_else(|| { - debug_assert_eq!(self.promoted, None); + // We must not use the parents default substs for promoted constants + // as that can result in incorrect substs and calls the `default_anon_const_substs` + // for something that might not actually be a constant. + debug_assert_eq!(self.promoted, Default::default()); tcx.default_anon_const_substs(self.def.did) }) } diff --git a/compiler/rustc_middle/src/ty/flags.rs b/compiler/rustc_middle/src/ty/flags.rs index 1c4f24cdf39..763da7e82c8 100644 --- a/compiler/rustc_middle/src/ty/flags.rs +++ b/compiler/rustc_middle/src/ty/flags.rs @@ -310,7 +310,7 @@ impl FlagComputation { } } - fn add_unevaluated_const(&mut self, ct: ty::Unevaluated<'tcx>) { + fn add_unevaluated_const<P>(&mut self, ct: ty::Unevaluated<'tcx, P>) { if let Some(substs) = ct.substs_ { self.add_substs(substs); } else { diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs index b1ebe43c491..8f814a84b49 100644 --- a/compiler/rustc_middle/src/ty/mod.rs +++ b/compiler/rustc_middle/src/ty/mod.rs @@ -406,7 +406,7 @@ crate struct PredicateInner<'tcx> { } #[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] -static_assert_size!(PredicateInner<'_>, 56); +static_assert_size!(PredicateInner<'_>, 48); #[derive(Clone, Copy, Lift)] pub struct Predicate<'tcx> { @@ -502,7 +502,7 @@ pub enum PredicateKind<'tcx> { Coerce(CoercePredicate<'tcx>), /// Constant initializer must evaluate successfully. - ConstEvaluatable(ty::Unevaluated<'tcx>), + ConstEvaluatable(ty::Unevaluated<'tcx, ()>), /// Constants must be equal. The first component is the const that is expected. ConstEquate(&'tcx Const<'tcx>, &'tcx Const<'tcx>), diff --git a/compiler/rustc_middle/src/ty/relate.rs b/compiler/rustc_middle/src/ty/relate.rs index b64d507e0b8..4a2c8349fdc 100644 --- a/compiler/rustc_middle/src/ty/relate.rs +++ b/compiler/rustc_middle/src/ty/relate.rs @@ -579,7 +579,7 @@ pub fn super_relate_consts<R: TypeRelation<'tcx>>( (ty::ConstKind::Unevaluated(au), ty::ConstKind::Unevaluated(bu)) if tcx.features().const_evaluatable_checked => { - tcx.try_unify_abstract_consts((au, bu)) + tcx.try_unify_abstract_consts((au.shrink(), bu.shrink())) } // While this is slightly incorrect, it shouldn't matter for `min_const_generics` diff --git a/compiler/rustc_middle/src/ty/structural_impls.rs b/compiler/rustc_middle/src/ty/structural_impls.rs index 31088423efa..2ab25c83970 100644 --- a/compiler/rustc_middle/src/ty/structural_impls.rs +++ b/compiler/rustc_middle/src/ty/structural_impls.rs @@ -1105,3 +1105,28 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Unevaluated<'tcx> { } } } + +impl<'tcx> TypeFoldable<'tcx> for ty::Unevaluated<'tcx, ()> { + fn super_fold_with<F: TypeFolder<'tcx>>(self, folder: &mut F) -> Self { + ty::Unevaluated { + def: self.def, + substs_: Some(self.substs(folder.tcx()).fold_with(folder)), + promoted: self.promoted, + } + } + + fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> { + visitor.visit_unevaluated_const(self.expand()) + } + + fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> { + if let Some(tcx) = visitor.tcx_for_anon_const_substs() { + self.substs(tcx).visit_with(visitor) + } else if let Some(substs) = self.substs_ { + substs.visit_with(visitor) + } else { + debug!("ignoring default substs of `{:?}`", self.def); + ControlFlow::CONTINUE + } + } +} |
