cleanup const generics FIXME
This commit is contained in:
parent
608b5e1c20
commit
fc2a2650e2
1 changed files with 5 additions and 30 deletions
|
@ -820,10 +820,10 @@ fn contains_illegal_self_type_reference<'tcx, T: TypeFoldable<'tcx>>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_const(&mut self, ct: &ty::Const<'tcx>) -> ControlFlow<Self::BreakTy> {
|
fn visit_unevaluated_const(
|
||||||
// First check if the type of this constant references `Self`.
|
&mut self,
|
||||||
self.visit_ty(ct.ty)?;
|
uv: ty::Unevaluated<'tcx>,
|
||||||
|
) -> ControlFlow<Self::BreakTy> {
|
||||||
// Constants can only influence object safety if they reference `Self`.
|
// Constants can only influence object safety if they reference `Self`.
|
||||||
// This is only possible for unevaluated constants, so we walk these here.
|
// This is only possible for unevaluated constants, so we walk these here.
|
||||||
//
|
//
|
||||||
|
@ -837,7 +837,7 @@ fn contains_illegal_self_type_reference<'tcx, T: TypeFoldable<'tcx>>(
|
||||||
// This shouldn't really matter though as we can't really use any
|
// This shouldn't really matter though as we can't really use any
|
||||||
// constants which are not considered const evaluatable.
|
// constants which are not considered const evaluatable.
|
||||||
use rustc_middle::mir::abstract_const::Node;
|
use rustc_middle::mir::abstract_const::Node;
|
||||||
if let Ok(Some(ct)) = AbstractConst::from_const(self.tcx, ct) {
|
if let Ok(Some(ct)) = AbstractConst::new(self.tcx, uv.shrink()) {
|
||||||
const_evaluatable::walk_abstract_const(self.tcx, ct, |node| match node.root() {
|
const_evaluatable::walk_abstract_const(self.tcx, ct, |node| match node.root() {
|
||||||
Node::Leaf(leaf) => {
|
Node::Leaf(leaf) => {
|
||||||
let leaf = leaf.subst(self.tcx, ct.substs);
|
let leaf = leaf.subst(self.tcx, ct.substs);
|
||||||
|
@ -852,31 +852,6 @@ fn contains_illegal_self_type_reference<'tcx, T: TypeFoldable<'tcx>>(
|
||||||
ControlFlow::CONTINUE
|
ControlFlow::CONTINUE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_predicate(&mut self, pred: ty::Predicate<'tcx>) -> ControlFlow<Self::BreakTy> {
|
|
||||||
if let ty::PredicateKind::ConstEvaluatable(ct) = pred.kind().skip_binder() {
|
|
||||||
// FIXME(generic_const_exprs): We should probably deduplicate the logic for
|
|
||||||
// `AbstractConst`s here, it might make sense to change `ConstEvaluatable` to
|
|
||||||
// take a `ty::Const` instead.
|
|
||||||
use rustc_middle::mir::abstract_const::Node;
|
|
||||||
if let Ok(Some(ct)) = AbstractConst::new(self.tcx, ct) {
|
|
||||||
const_evaluatable::walk_abstract_const(self.tcx, ct, |node| match node.root() {
|
|
||||||
Node::Leaf(leaf) => {
|
|
||||||
let leaf = leaf.subst(self.tcx, ct.substs);
|
|
||||||
self.visit_const(leaf)
|
|
||||||
}
|
|
||||||
Node::Cast(_, _, ty) => self.visit_ty(ty),
|
|
||||||
Node::Binop(..) | Node::UnaryOp(..) | Node::FunctionCall(_, _) => {
|
|
||||||
ControlFlow::CONTINUE
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
ControlFlow::CONTINUE
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pred.super_visit_with(self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
value
|
value
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue