Relax restrictions for copy operands

This commit is contained in:
Jakob Degen 2022-04-22 16:43:26 -04:00
parent 5ffebc2cb3
commit ae7d6facda
2 changed files with 8 additions and 3 deletions

View File

@ -214,7 +214,8 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
fn visit_operand(&mut self, operand: &Operand<'tcx>, location: Location) { fn visit_operand(&mut self, operand: &Operand<'tcx>, location: Location) {
// This check is somewhat expensive, so only run it when -Zvalidate-mir is passed. // This check is somewhat expensive, so only run it when -Zvalidate-mir is passed.
if self.tcx.sess.opts.debugging_opts.validate_mir { if self.tcx.sess.opts.debugging_opts.validate_mir && self.mir_phase < MirPhase::DropsLowered
{
// `Operand::Copy` is only supposed to be used with `Copy` types. // `Operand::Copy` is only supposed to be used with `Copy` types.
if let Operand::Copy(place) = operand { if let Operand::Copy(place) = operand {
let ty = place.ty(&self.body.local_decls, self.tcx).ty; let ty = place.ty(&self.body.local_decls, self.tcx).ty;

View File

@ -166,7 +166,8 @@ pub enum MirPhase {
/// * [`StatementKind::Retag`] /// * [`StatementKind::Retag`]
/// ///
/// Furthermore, `Drop` now uses explicit drop flags visible in the MIR and reaching a `Drop` /// Furthermore, `Drop` now uses explicit drop flags visible in the MIR and reaching a `Drop`
/// terminator means that the auto-generated drop glue will be invoked. /// terminator means that the auto-generated drop glue will be invoked. Also, `Copy` operands
/// are allowed for non-`Copy` types.
DropsLowered = 3, DropsLowered = 3,
/// Beginning with this phase, the following variant is disallowed: /// Beginning with this phase, the following variant is disallowed:
/// * [`Rvalue::Aggregate`] for any `AggregateKind` except `Array` /// * [`Rvalue::Aggregate`] for any `AggregateKind` except `Array`
@ -2330,7 +2331,10 @@ pub struct SourceScopeLocalData {
/// validator. /// validator.
#[derive(Clone, PartialEq, TyEncodable, TyDecodable, Hash, HashStable)] #[derive(Clone, PartialEq, TyEncodable, TyDecodable, Hash, HashStable)]
pub enum Operand<'tcx> { pub enum Operand<'tcx> {
/// Creates a value by loading the given place. The type of the place must be `Copy` /// Creates a value by loading the given place.
///
/// Before drop elaboration, the type of the place must be `Copy`. After drop elaboration there
/// is no such requirement.
Copy(Place<'tcx>), Copy(Place<'tcx>),
/// Creates a value by performing loading the place, just like the `Copy` operand. /// Creates a value by performing loading the place, just like the `Copy` operand.