diff options
| author | Santiago Pastorino <spastorino@gmail.com> | 2019-05-27 21:47:24 +0200 |
|---|---|---|
| committer | Santiago Pastorino <spastorino@gmail.com> | 2019-05-27 22:17:42 +0200 |
| commit | fb4b62b87bd35019e2c797d30572ba8188feff9c (patch) | |
| tree | 63a4d2a3a2d553e20f9b13a93c58dbc2d683d26b | |
| parent | acaf284e5580c5f65489a062635f1829551bec08 (diff) | |
| download | rust-fb4b62b87bd35019e2c797d30572ba8188feff9c.tar.gz rust-fb4b62b87bd35019e2c797d30572ba8188feff9c.zip | |
Make check_place iterate instead of recurse
| -rw-r--r-- | src/librustc_mir/transform/qualify_min_const_fn.rs | 37 |
1 files changed, 19 insertions, 18 deletions
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( |
