diff --git a/compiler/rustc_middle/src/ty/util.rs b/compiler/rustc_middle/src/ty/util.rs index f72e236eda13..6cbdac2a8cbc 100644 --- a/compiler/rustc_middle/src/ty/util.rs +++ b/compiler/rustc_middle/src/ty/util.rs @@ -849,7 +849,7 @@ impl<'tcx> Ty<'tcx> { /// /// Returning true means the type is known to be `Freeze`. Returning /// `false` means nothing -- could be `Freeze`, might not be. - fn is_trivially_freeze(self) -> bool { + pub fn is_trivially_freeze(self) -> bool { match self.kind() { ty::Int(_) | ty::Uint(_) diff --git a/compiler/rustc_mir_dataflow/src/value_analysis.rs b/compiler/rustc_mir_dataflow/src/value_analysis.rs index 510856da92fb..766a659adca5 100644 --- a/compiler/rustc_mir_dataflow/src/value_analysis.rs +++ b/compiler/rustc_mir_dataflow/src/value_analysis.rs @@ -674,7 +674,11 @@ impl Map { return Err(()); } - // FIXME: Check that the place is `Freeze`. + if !ty.is_trivially_freeze() { + // Due to the way we deal with shared references, only `Freeze` types may be tracked. + // We are a little bit to restrictive here by only allowing trivially `Freeze` types. + return Err(()); + } let place = self.make_place(local, projection)?;