]> git.lizzy.rs Git - rust.git/commitdiff
Refactor 'ReadForMatch' into 'FakeRead' and add the cause of the fake read
authorRemy Rakic <remy.rakic@gmail.com>
Fri, 14 Sep 2018 19:05:31 +0000 (21:05 +0200)
committerRemy Rakic <remy.rakic@gmail.com>
Tue, 18 Sep 2018 12:36:37 +0000 (14:36 +0200)
19 files changed:
src/librustc/ich/impls_mir.rs
src/librustc/mir/mod.rs
src/librustc/mir/visit.rs
src/librustc/session/config.rs
src/librustc/ty/context.rs
src/librustc_codegen_llvm/mir/statement.rs
src/librustc_mir/borrow_check/mod.rs
src/librustc_mir/borrow_check/nll/invalidation.rs
src/librustc_mir/borrow_check/nll/type_check/mod.rs
src/librustc_mir/build/matches/mod.rs
src/librustc_mir/dataflow/impls/borrows.rs
src/librustc_mir/dataflow/move_paths/builder.rs
src/librustc_mir/interpret/step.rs
src/librustc_mir/transform/check_unsafety.rs
src/librustc_mir/transform/qualify_consts.rs
src/librustc_mir/transform/qualify_min_const_fn.rs
src/librustc_mir/transform/remove_noop_landing_pads.rs
src/librustc_mir/transform/rustc_peek.rs
src/librustc_passes/mir_stats.rs

index 5f35c9fea0a337248d24634e744a0c6b5427fe99..313ef054829c5adcd6e7f393d80faebf12f68350 100644 (file)
@@ -238,7 +238,8 @@ fn hash_stable<W: StableHasherResult>(&self,
                 place.hash_stable(hcx, hasher);
                 rvalue.hash_stable(hcx, hasher);
             }
-            mir::StatementKind::ReadForMatch(ref place) => {
+            mir::StatementKind::FakeRead(ref cause, ref place) => {
+                cause.hash_stable(hcx, hasher);
                 place.hash_stable(hcx, hasher);
             }
             mir::StatementKind::SetDiscriminant { ref place, variant_index } => {
@@ -271,6 +272,8 @@ fn hash_stable<W: StableHasherResult>(&self,
     }
 }
 
+impl_stable_hash_for!(enum mir::FakeReadCause { ForMatch, ForLet });
+
 impl<'a, 'gcx, T> HashStable<StableHashingContext<'a>>
     for mir::ValidationOperand<'gcx, T>
     where T: HashStable<StableHashingContext<'a>>
index 3450eec8082f37a2bf9885173b7cf438c50c697e..8e9c1ad23c8643eb31391600140969491b6ce567 100644 (file)
@@ -1613,8 +1613,10 @@ pub enum StatementKind<'tcx> {
     Assign(Place<'tcx>, Rvalue<'tcx>),
 
     /// This represents all the reading that a pattern match may do
-    /// (e.g. inspecting constants and discriminant values).
-    ReadForMatch(Place<'tcx>),
+    /// (e.g. inspecting constants and discriminant values), and the
+    /// kind of pattern it comes from. This is in order to adapt potential
+    /// error messages to these specific patterns.
+    FakeRead(FakeReadCause, Place<'tcx>),
 
     /// Write the discriminant for a variant to the enum Place.
     SetDiscriminant {
@@ -1662,6 +1664,13 @@ pub enum StatementKind<'tcx> {
     Nop,
 }
 
+/// The `FakeReadCause` describes the type of pattern why a `FakeRead` statement exists.
+#[derive(Copy, Clone, RustcEncodable, RustcDecodable, Debug)]
+pub enum FakeReadCause {
+    ForMatch,
+    ForLet,
+}
+
 /// The `ValidationOp` describes what happens with each of the operands of a
 /// `Validate` statement.
 #[derive(Copy, Clone, RustcEncodable, RustcDecodable, PartialEq, Eq)]
@@ -1718,7 +1727,7 @@ fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
         use self::StatementKind::*;
         match self.kind {
             Assign(ref place, ref rv) => write!(fmt, "{:?} = {:?}", place, rv),
-            ReadForMatch(ref place) => write!(fmt, "ReadForMatch({:?})", place),
+            FakeRead(ref cause, ref place) => write!(fmt, "FakeRead({:?}, {:?})", cause, place),
             // (reuse lifetime rendering policy from ppaux.)
             EndRegion(ref ce) => write!(fmt, "EndRegion({})", ty::ReScope(*ce)),
             Validate(ref op, ref places) => write!(fmt, "Validate({:?}, {:?})", op, places),
@@ -2585,6 +2594,7 @@ pub enum ClosureOutlivesSubject<'tcx> {
     Mutability,
     SourceInfo,
     UpvarDecl,
+    FakeReadCause,
     ValidationOp,
     SourceScope,
     SourceScopeData,
@@ -2651,7 +2661,7 @@ impl<'tcx> TypeFoldable<'tcx> for Statement<'tcx> {
 EnumTypeFoldableImpl! {
     impl<'tcx> TypeFoldable<'tcx> for StatementKind<'tcx> {
         (StatementKind::Assign)(a, b),
-        (StatementKind::ReadForMatch)(place),
+        (StatementKind::FakeRead)(cause, place),
         (StatementKind::SetDiscriminant) { place, variant_index },
         (StatementKind::StorageLive)(a),
         (StatementKind::StorageDead)(a),
index 0beb5ac0a3cb51e42e9e053a2f751b264ae11715..91c83ecb2e23ce308852999cf78ecc891a95dfc1 100644 (file)
@@ -354,7 +354,7 @@ fn super_statement(&mut self,
                                           ref $($mutability)* rvalue) => {
                         self.visit_assign(block, place, rvalue, location);
                     }
-                    StatementKind::ReadForMatch(ref $($mutability)* place) => {
+                    StatementKind::FakeRead(_, ref $($mutability)* place) => {
                         self.visit_place(place,
                                          PlaceContext::Inspect,
                                          location);
index e4d633c3f2cf27ccb1e1bb4a2025f699f0145016..1fdbf687be8f81f3c99820b1240cf0c00cb6eff0 100644 (file)
@@ -1330,7 +1330,7 @@ fn parse_cross_lang_lto(slot: &mut CrossLangLto, v: Option<&str>) -> bool {
     disable_nll_user_type_assert: bool = (false, parse_bool, [UNTRACKED],
         "disable user provided type assertion in NLL"),
     nll_dont_emit_read_for_match: bool = (false, parse_bool, [UNTRACKED],
-        "in match codegen, do not include ReadForMatch statements (used by mir-borrowck)"),
+        "in match codegen, do not include FakeRead statements (used by mir-borrowck)"),
     dont_buffer_diagnostics: bool = (false, parse_bool, [UNTRACKED],
         "emit diagnostics rather than buffering (breaks NLL error downgrading, sorting)."),
     polonius: bool = (false, parse_bool, [UNTRACKED],
index 03c0b680acf78327953bc3f37f05e4c49650ddd2..aaa0b9fe51321a0b4bd8b4acd67ddd9290a1c2cc 100644 (file)
@@ -1478,7 +1478,7 @@ pub fn generate_borrow_of_any_match_input(&self) -> bool {
         self.emit_read_for_match()
     }
 
-    /// If true, make MIR codegen for `match` emit ReadForMatch
+    /// If true, make MIR codegen for `match` emit FakeRead
     /// statements (which simulate the maximal effect of executing the
     /// patterns in a match arm).
     pub fn emit_read_for_match(&self) -> bool {
index 0cb8f99efc33fd66cb6a78db907aee2302ae660e..b4eb7615f98b42fbf59f404c815514c3bfcd6e5c 100644 (file)
@@ -89,7 +89,7 @@ pub fn codegen_statement(&mut self,
                 asm::codegen_inline_asm(&bx, asm, outputs, input_vals);
                 bx
             }
-            mir::StatementKind::ReadForMatch(_) |
+            mir::StatementKind::FakeRead(..) |
             mir::StatementKind::EndRegion(_) |
             mir::StatementKind::Validate(..) |
             mir::StatementKind::AscribeUserType(..) |
index 521e7ade00ea9efb2edef0dd484ccaeb134cb0c9..478a2326be3a6c600e333e50fabc6e563df57123 100644 (file)
@@ -478,9 +478,9 @@ fn visit_statement_entry(
                     flow_state,
                 );
             }
-            StatementKind::ReadForMatch(ref place) => {
+            StatementKind::FakeRead(_, ref place) => {
                 self.access_place(
-                    ContextKind::ReadForMatch.new(location),
+                    ContextKind::FakeRead.new(location),
                     (place, span),
                     (Deep, Read(ReadKind::Borrow(BorrowKind::Shared))),
                     LocalMutationIsAllowed::No,
@@ -2206,7 +2206,7 @@ enum ContextKind {
     CallDest,
     Assert,
     Yield,
-    ReadForMatch,
+    FakeRead,
     StorageDead,
 }
 
index 71345f22e443b455b2cb01b1cee80232570d6801..0b7fededa973236c37c7b791d1eab88553890a66 100644 (file)
@@ -93,9 +93,9 @@ fn visit_statement(&mut self,
                     JustWrite
                 );
             }
-            StatementKind::ReadForMatch(ref place) => {
+            StatementKind::FakeRead(_, ref place) => {
                 self.access_place(
-                    ContextKind::ReadForMatch.new(location),
+                    ContextKind::FakeRead.new(location),
                     place,
                     (Deep, Read(ReadKind::Borrow(BorrowKind::Shared))),
                     LocalMutationIsAllowed::No,
index de96539ec30f106a8e3df51123b22657992f89ce..1f12e9c747f450c86a89b102831ce5267fbacedb 100644 (file)
@@ -995,7 +995,7 @@ fn check_stmt(&mut self, mir: &Mir<'tcx>, stmt: &Statement<'tcx>, location: Loca
                     );
                 }
             }
-            StatementKind::ReadForMatch(_)
+            StatementKind::FakeRead(..)
             | StatementKind::StorageLive(_)
             | StatementKind::StorageDead(_)
             | StatementKind::InlineAsm { .. }
index 5c72679800c4428c9e179a4679d7d6939938831f..49c1308329f3c13d70cd2a6ba9931bd6f0bd4b46 100644 (file)
@@ -157,7 +157,7 @@ pub fn match_expr(
                             *pre_binding_block,
                             Statement {
                                 source_info: pattern_source_info,
-                                kind: StatementKind::ReadForMatch(borrow_temp.clone()),
+                                kind: StatementKind::FakeRead(FakeReadCause::ForMatch, borrow_temp.clone()),
                             },
                         );
                     }
@@ -284,7 +284,7 @@ pub fn expr_into_pattern(
                     block,
                     Statement {
                         source_info,
-                        kind: StatementKind::ReadForMatch(place.clone()),
+                        kind: StatementKind::FakeRead(FakeReadCause::ForLet, place.clone()),
                     },
                 );
 
@@ -336,7 +336,7 @@ pub fn expr_into_pattern(
                     block,
                     Statement {
                         source_info,
-                        kind: StatementKind::ReadForMatch(place.clone()),
+                        kind: StatementKind::FakeRead(FakeReadCause::ForLet, place.clone()),
                     },
                 );
 
index 010ffafc4bd60db7e057529b301a01cf478ec368..ed2f780baf1c29dca01f9322b81c4523daf18e5f 100644 (file)
@@ -336,7 +336,7 @@ fn statement_effect(&self, sets: &mut BlockSets<BorrowIndex>, location: Location
                 }
             }
 
-            mir::StatementKind::ReadForMatch(..) |
+            mir::StatementKind::FakeRead(..) |
             mir::StatementKind::SetDiscriminant { .. } |
             mir::StatementKind::StorageLive(..) |
             mir::StatementKind::Validate(..) |
index 5451d27082db75d2e2319de4f1fd1de7fa4c21a9..63adcb5132a7142d183bedc7480b37bfe3bd838d 100644 (file)
@@ -281,7 +281,7 @@ fn gather_statement(&mut self, stmt: &Statement<'tcx>) {
                 }
                 self.gather_rvalue(rval);
             }
-            StatementKind::ReadForMatch(ref place) => {
+            StatementKind::FakeRead(_, ref place) => {
                 self.create_move_path(place);
             }
             StatementKind::InlineAsm { ref outputs, ref inputs, ref asm } => {
index 5bdaf6ba729632d6fb440e8c8020ee46ec98418a..5db7e0b5eb531fa2c1be8334e6a91b5fe7988078 100644 (file)
@@ -150,9 +150,9 @@ fn statement(&mut self, stmt: &mir::Statement<'tcx>) -> EvalResult<'tcx> {
                 self.deallocate_local(old_val)?;
             }
 
-            // No dynamic semantics attached to `ReadForMatch`; MIR
+            // No dynamic semantics attached to `FakeRead`; MIR
             // interpreter is solely intended for borrowck'ed code.
-            ReadForMatch(..) => {}
+            FakeRead(..) => {}
 
             // Validity checks.
             Validate(op, ref places) => {
index 6fbc2f85c08dab24068373d5571cc08e7b16516b..286de52bec5cae574859100116fd81918fbc0cfc 100644 (file)
@@ -108,7 +108,7 @@ fn visit_statement(&mut self,
         self.source_info = statement.source_info;
         match statement.kind {
             StatementKind::Assign(..) |
-            StatementKind::ReadForMatch(..) |
+            StatementKind::FakeRead(..) |
             StatementKind::SetDiscriminant { .. } |
             StatementKind::StorageLive(..) |
             StatementKind::StorageDead(..) |
index bc9cc7274d5e78797581750ce89230f5475e5ba0..a997bd37c50a39a8468fc0f7afeea95154f1d51d 100644 (file)
@@ -1090,7 +1090,7 @@ fn visit_statement(&mut self, bb: BasicBlock, statement: &Statement<'tcx>, locat
                 StatementKind::Assign(ref place, ref rvalue) => {
                     this.visit_assign(bb, place, rvalue, location);
                 }
-                StatementKind::ReadForMatch(..) |
+                StatementKind::FakeRead(..) |
                 StatementKind::SetDiscriminant { .. } |
                 StatementKind::StorageLive(_) |
                 StatementKind::StorageDead(_) |
index f7e44dde186fe04c4005fd4f0932c909362308ef..541b3c0607de31686bb433287dd5a1411d6c26fb 100644 (file)
@@ -216,7 +216,7 @@ fn check_statement(
             check_rvalue(tcx, mir, rval, span)
         }
 
-        StatementKind::ReadForMatch(_) => Err((span, "match in const fn is unstable".into())),
+        StatementKind::FakeRead(..) => Err((span, "match in const fn is unstable".into())),
 
         // just an assignment
         StatementKind::SetDiscriminant { .. } => Ok(()),
index 9cdd94a7be7f168e1a7552f81d46b5c06ee812b5..298e38228d3570b3e0673aa9e3159aaeeb248ef1 100644 (file)
@@ -49,7 +49,7 @@ fn is_nop_landing_pad(
     ) -> bool {
         for stmt in &mir[bb].statements {
             match stmt.kind {
-                StatementKind::ReadForMatch(_) |
+                StatementKind::FakeRead(..) |
                 StatementKind::StorageLive(_) |
                 StatementKind::StorageDead(_) |
                 StatementKind::EndRegion(_) |
index 3c898eedebcc49582b980eda60be6d01e9a4df6f..487a18f6620b2c9edfd434068f81bb5797bfab86 100644 (file)
@@ -157,7 +157,7 @@ fn each_block<'a, 'tcx, O>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
             mir::StatementKind::Assign(ref place, ref rvalue) => {
                 (place, rvalue)
             }
-            mir::StatementKind::ReadForMatch(_) |
+            mir::StatementKind::FakeRead(..) |
             mir::StatementKind::StorageLive(_) |
             mir::StatementKind::StorageDead(_) |
             mir::StatementKind::InlineAsm { .. } |
index 0120b5bc5322f1239490cd405c588a6dd72c675e..0b9b20d3c45398495cbe898d729a1968ac562ca6 100644 (file)
@@ -82,7 +82,7 @@ fn visit_statement(&mut self,
         self.record("Statement", statement);
         self.record(match statement.kind {
             StatementKind::Assign(..) => "StatementKind::Assign",
-            StatementKind::ReadForMatch(..) => "StatementKind::ReadForMatch",
+            StatementKind::FakeRead(..) => "StatementKind::FakeRead",
             StatementKind::EndRegion(..) => "StatementKind::EndRegion",
             StatementKind::Validate(..) => "StatementKind::Validate",
             StatementKind::SetDiscriminant { .. } => "StatementKind::SetDiscriminant",