1
Fork 0

Lower discriminant_value intrinsic

This allows const propagation to evaluate comparisons involving
field-less enums using derived implementations of `PartialEq` (after
inlining `eq`).
This commit is contained in:
Tomasz Miąsko 2020-12-11 00:00:00 +00:00
parent d32c320d7e
commit 686237c49a
5 changed files with 191 additions and 6 deletions

View file

@ -83,6 +83,21 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
terminator.kind = TerminatorKind::Goto { target };
}
}
sym::discriminant_value => {
if let (Some((destination, target)), Some(arg)) =
(*destination, args[0].place())
{
let arg = tcx.mk_place_deref(arg);
block.statements.push(Statement {
source_info: terminator.source_info,
kind: StatementKind::Assign(box (
destination,
Rvalue::Discriminant(arg),
)),
});
terminator.kind = TerminatorKind::Goto { target };
}
}
_ => {}
}
}