diff --git a/compiler/rustc_mir_transform/src/dataflow_const_prop.rs b/compiler/rustc_mir_transform/src/dataflow_const_prop.rs index f3ca2337e59ca..4dc1564ce3b5d 100644 --- a/compiler/rustc_mir_transform/src/dataflow_const_prop.rs +++ b/compiler/rustc_mir_transform/src/dataflow_const_prop.rs @@ -122,7 +122,10 @@ impl<'tcx> ValueAnalysis<'tcx> for ConstAnalysis<'_, 'tcx> { ) { match rvalue { Rvalue::Aggregate(kind, operands) => { - state.flood_with(target.as_ref(), self.map(), FlatSet::Bottom); + // If we assign `target = Enum::Variant#0(operand)`, + // we must make sure that all `target as Variant#i` are `Top`. + state.flood(target.as_ref(), self.map()); + if let Some(target_idx) = self.map().find(target.as_ref()) { let (variant_target, variant_index) = match **kind { AggregateKind::Tuple | AggregateKind::Closure(..) => { diff --git a/tests/mir-opt/dataflow-const-prop/enum.multiple.DataflowConstProp.diff b/tests/mir-opt/dataflow-const-prop/enum.multiple.DataflowConstProp.diff index 5a1a608952cd9..c4002d65e5db5 100644 --- a/tests/mir-opt/dataflow-const-prop/enum.multiple.DataflowConstProp.diff +++ b/tests/mir-opt/dataflow-const-prop/enum.multiple.DataflowConstProp.diff @@ -71,8 +71,7 @@ bb7: { StorageLive(_9); // scope 2 at $DIR/enum.rs:+11:9: +11:10 -- _9 = _6; // scope 2 at $DIR/enum.rs:+11:13: +11:14 -+ _9 = const 0_u8; // scope 2 at $DIR/enum.rs:+11:13: +11:14 + _9 = _6; // scope 2 at $DIR/enum.rs:+11:13: +11:14 _0 = const (); // scope 0 at $DIR/enum.rs:+0:29: +12:2 StorageDead(_9); // scope 2 at $DIR/enum.rs:+12:1: +12:2 StorageDead(_6); // scope 1 at $DIR/enum.rs:+12:1: +12:2