diff options
| author | Jakob Degen <jakob.e.degen@gmail.com> | 2022-04-22 16:43:26 -0400 |
|---|---|---|
| committer | Jakob Degen <jakob.e.degen@gmail.com> | 2022-04-22 16:45:15 -0400 |
| commit | ae7d6facdaf2aab55e53e6d4b44003940819a27f (patch) | |
| tree | d2f6ec640dbbdeecc79da6a23e80d8ea47adf69c | |
| parent | 5ffebc2cb3a089c27a4c7da13d09fd2365c288aa (diff) | |
| download | rust-ae7d6facdaf2aab55e53e6d4b44003940819a27f.tar.gz rust-ae7d6facdaf2aab55e53e6d4b44003940819a27f.zip | |
Relax restrictions for copy operands
| -rw-r--r-- | compiler/rustc_const_eval/src/transform/validate.rs | 3 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/mir/mod.rs | 8 |
2 files changed, 8 insertions, 3 deletions
diff --git a/compiler/rustc_const_eval/src/transform/validate.rs b/compiler/rustc_const_eval/src/transform/validate.rs index 79d427ccc44..f71bc586b48 100644 --- a/compiler/rustc_const_eval/src/transform/validate.rs +++ b/compiler/rustc_const_eval/src/transform/validate.rs @@ -214,7 +214,8 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> { fn visit_operand(&mut self, operand: &Operand<'tcx>, location: Location) { // 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. if let Operand::Copy(place) = operand { let ty = place.ty(&self.body.local_decls, self.tcx).ty; diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index 4f4b6cf704f..881f59ae464 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -166,7 +166,8 @@ pub enum MirPhase { /// * [`StatementKind::Retag`] /// /// 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, /// Beginning with this phase, the following variant is disallowed: /// * [`Rvalue::Aggregate`] for any `AggregateKind` except `Array` @@ -2330,7 +2331,10 @@ pub struct SourceScopeLocalData { /// validator. #[derive(Clone, PartialEq, TyEncodable, TyDecodable, Hash, HashStable)] 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>), /// Creates a value by performing loading the place, just like the `Copy` operand. |
