From a70ac50ec4cfcda283f0cb5292ea7ef14d861748 Mon Sep 17 00:00:00 2001 From: Dylan MacKenzie Date: Wed, 27 Nov 2019 14:04:11 -0800 Subject: [PATCH] Don't treat a reference to a `static` as a reborrow They now look the same in the MIR after #66587. --- .../transform/check_consts/validation.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/librustc_mir/transform/check_consts/validation.rs b/src/librustc_mir/transform/check_consts/validation.rs index 4d8f9720af0..bc13764f0a3 100644 --- a/src/librustc_mir/transform/check_consts/validation.rs +++ b/src/librustc_mir/transform/check_consts/validation.rs @@ -705,6 +705,19 @@ fn place_as_reborrow( return None; } + // A borrow of a `static` also looks like `&(*_1)` in the MIR, but `_1` is a `const` + // that points to the allocation for the static. Don't treat these as reborrows. + if let PlaceBase::Local(local) = place.base { + let decl = &body.local_decls[local]; + if let LocalInfo::StaticRef { .. } = decl.local_info { + return None; + } + } + + // Ensure the type being derefed is a reference and not a raw pointer. + // + // This is sufficient to prevent an access to a `static mut` from being marked as a + // reborrow, even if the check above were to disappear. let inner_ty = Place::ty_from(&place.base, inner, body, tcx).ty; match inner_ty.kind { ty::Ref(..) => Some(inner), -- 2.44.0