From c66ad1405782c49bc01b9c2a0b3634765a7cecea Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Tue, 26 Nov 2019 08:27:31 -0500 Subject: [PATCH 1/3] Check SetDiscriminant place --- src/librustc_mir/transform/check_consts/validation.rs | 5 ++++- src/librustc_mir/transform/qualify_min_const_fn.rs | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/librustc_mir/transform/check_consts/validation.rs b/src/librustc_mir/transform/check_consts/validation.rs index bee37f69a5ec5..5c3cffe3ce82b 100644 --- a/src/librustc_mir/transform/check_consts/validation.rs +++ b/src/librustc_mir/transform/check_consts/validation.rs @@ -566,9 +566,12 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { StatementKind::FakeRead(FakeReadCause::ForMatchedPlace, _) => { self.check_op(ops::IfOrMatch); } + StatementKind::SetDiscriminant { ref place, .. } => { + let ctx = PlaceContext::MutatingUse(MutatingUseContext::Projection); + self.visit_place(&place, ctx, location) + } // FIXME(eddyb) should these really do nothing? StatementKind::FakeRead(..) | - StatementKind::SetDiscriminant { .. } | StatementKind::StorageLive(_) | StatementKind::StorageDead(_) | StatementKind::InlineAsm {..} | diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index 71f13c169d41e..4bfabf4c3e2c1 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -225,7 +225,7 @@ fn check_statement( StatementKind::FakeRead(_, place) => check_place(tcx, place, span, def_id, body), // just an assignment - StatementKind::SetDiscriminant { .. } => Ok(()), + StatementKind::SetDiscriminant { place, .. } => check_place(tcx, place, span, def_id, body), | StatementKind::InlineAsm { .. } => { Err((span, "cannot use inline assembly in const fn".into())) From d7c09f7e1e446390ed3f02ed576a1efce5279b96 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Tue, 26 Nov 2019 17:23:24 -0500 Subject: [PATCH 2/3] Change way of checking SetDiscriminant --- src/librustc_mir/transform/check_consts/validation.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/librustc_mir/transform/check_consts/validation.rs b/src/librustc_mir/transform/check_consts/validation.rs index 5c3cffe3ce82b..7b26ba58e6154 100644 --- a/src/librustc_mir/transform/check_consts/validation.rs +++ b/src/librustc_mir/transform/check_consts/validation.rs @@ -566,9 +566,8 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { StatementKind::FakeRead(FakeReadCause::ForMatchedPlace, _) => { self.check_op(ops::IfOrMatch); } - StatementKind::SetDiscriminant { ref place, .. } => { - let ctx = PlaceContext::MutatingUse(MutatingUseContext::Projection); - self.visit_place(&place, ctx, location) + StatementKind::SetDiscriminant { .. } => { + self.super_statement(statement, location) } // FIXME(eddyb) should these really do nothing? StatementKind::FakeRead(..) | From 2ced9d96e7b70237daa69bd8d421f0421d57e676 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Sat, 30 Nov 2019 12:25:45 -0500 Subject: [PATCH 3/3] Merge match branches --- src/librustc_mir/transform/check_consts/validation.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/librustc_mir/transform/check_consts/validation.rs b/src/librustc_mir/transform/check_consts/validation.rs index 7b26ba58e6154..829d9ee6fafd7 100644 --- a/src/librustc_mir/transform/check_consts/validation.rs +++ b/src/librustc_mir/transform/check_consts/validation.rs @@ -560,15 +560,12 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { trace!("visit_statement: statement={:?} location={:?}", statement, location); match statement.kind { - StatementKind::Assign(..) => { + StatementKind::Assign(..) | StatementKind::SetDiscriminant { .. } => { self.super_statement(statement, location); } StatementKind::FakeRead(FakeReadCause::ForMatchedPlace, _) => { self.check_op(ops::IfOrMatch); } - StatementKind::SetDiscriminant { .. } => { - self.super_statement(statement, location) - } // FIXME(eddyb) should these really do nothing? StatementKind::FakeRead(..) | StatementKind::StorageLive(_) |