about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoxane <roxane.fruytier@hotmail.com>2021-05-25 18:30:54 -0400
committerRoxane <roxane.fruytier@hotmail.com>2021-05-27 17:47:04 -0400
commit027d73dcad10c5d70a313809ff584fc8f054b6a8 (patch)
tree8f7bd6e587a327a3769c05f5645a3cb01ed88ff6
parente51830b90afd339332892a8f20db1957d43bf086 (diff)
downloadrust-027d73dcad10c5d70a313809ff584fc8f054b6a8.tar.gz
rust-027d73dcad10c5d70a313809ff584fc8f054b6a8.zip
Restrict Fake Read precision
-rw-r--r--compiler/rustc_typeck/src/check/upvar.rs5
1 files changed, 5 insertions, 0 deletions
diff --git a/compiler/rustc_typeck/src/check/upvar.rs b/compiler/rustc_typeck/src/check/upvar.rs
index 71e222c560a..6baa185406e 100644
--- a/compiler/rustc_typeck/src/check/upvar.rs
+++ b/compiler/rustc_typeck/src/check/upvar.rs
@@ -1588,6 +1588,11 @@ impl<'a, 'tcx> InferBorrowKind<'a, 'tcx> {
 impl<'a, 'tcx> euv::Delegate<'tcx> for InferBorrowKind<'a, 'tcx> {
     fn fake_read(&mut self, place: Place<'tcx>, cause: FakeReadCause, diag_expr_id: hir::HirId) {
         if let PlaceBase::Upvar(_) = place.base {
+            // We need to restrict Fake Read precision to avoid fake reading unsafe code,
+            // such as deref of a raw pointer.
+            let place = restrict_capture_precision(place);
+            let place =
+                restrict_repr_packed_field_ref_capture(self.fcx.tcx, self.fcx.param_env, &place);
             self.fake_reads.push((place, cause, diag_expr_id));
         }
     }