From: Santiago Pastorino Date: Mon, 27 May 2019 19:47:24 +0000 (+0200) Subject: Make check_place iterate instead of recurse X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=fb4b62b87bd35019e2c797d30572ba8188feff9c;p=rust.git Make check_place iterate instead of recurse --- diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index ce35a06f86a..a1e2d0683d3 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -250,28 +250,29 @@ fn check_operand( } } -fn check_place( - place: &Place<'tcx>, - span: Span, -) -> McfResult { - match place { - Place::Base(PlaceBase::Local(_)) => Ok(()), - // promoteds are always fine, they are essentially constants - Place::Base(PlaceBase::Static(box Static { kind: StaticKind::Promoted(_), .. })) => Ok(()), - Place::Base(PlaceBase::Static(box Static { kind: StaticKind::Static(_), .. })) => - Err((span, "cannot access `static` items in const fn".into())), - Place::Projection(proj) => { +fn check_place(place: &Place<'tcx>, span: Span) -> McfResult { + place.iterate(|place_base, place_projection| { + for proj in place_projection { match proj.elem { - | ProjectionElem::ConstantIndex { .. } | ProjectionElem::Subslice { .. } - | ProjectionElem::Deref | ProjectionElem::Field(..) | ProjectionElem::Index(_) => { - check_place(&proj.base, span) - } - | ProjectionElem::Downcast(..) => { - Err((span, "`match` or `if let` in `const fn` is unstable".into())) + ProjectionElem::Downcast(..) => { + return Err((span, "`match` or `if let` in `const fn` is unstable".into())); } + ProjectionElem::ConstantIndex { .. } + | ProjectionElem::Subslice { .. } + | ProjectionElem::Deref + | ProjectionElem::Field(..) + | ProjectionElem::Index(_) => {} } } - } + + match place_base { + PlaceBase::Static(box Static { kind: StaticKind::Static(_), .. }) => { + Err((span, "cannot access `static` items in const fn".into())) + } + PlaceBase::Local(_) + | PlaceBase::Static(box Static { kind: StaticKind::Promoted(_), .. }) => Ok(()), + } + }) } fn check_terminator(