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 } => {
}
}
+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>>
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 {
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)]
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),
Mutability,
SourceInfo,
UpvarDecl,
+ FakeReadCause,
ValidationOp,
SourceScope,
SourceScopeData,
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),
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);
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],
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 {
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(..) |
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,
CallDest,
Assert,
Yield,
- ReadForMatch,
+ FakeRead,
StorageDead,
}
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,
);
}
}
- StatementKind::ReadForMatch(_)
+ StatementKind::FakeRead(..)
| StatementKind::StorageLive(_)
| StatementKind::StorageDead(_)
| StatementKind::InlineAsm { .. }
*pre_binding_block,
Statement {
source_info: pattern_source_info,
- kind: StatementKind::ReadForMatch(borrow_temp.clone()),
+ kind: StatementKind::FakeRead(FakeReadCause::ForMatch, borrow_temp.clone()),
},
);
}
block,
Statement {
source_info,
- kind: StatementKind::ReadForMatch(place.clone()),
+ kind: StatementKind::FakeRead(FakeReadCause::ForLet, place.clone()),
},
);
block,
Statement {
source_info,
- kind: StatementKind::ReadForMatch(place.clone()),
+ kind: StatementKind::FakeRead(FakeReadCause::ForLet, place.clone()),
},
);
}
}
- mir::StatementKind::ReadForMatch(..) |
+ mir::StatementKind::FakeRead(..) |
mir::StatementKind::SetDiscriminant { .. } |
mir::StatementKind::StorageLive(..) |
mir::StatementKind::Validate(..) |
}
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 } => {
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) => {
self.source_info = statement.source_info;
match statement.kind {
StatementKind::Assign(..) |
- StatementKind::ReadForMatch(..) |
+ StatementKind::FakeRead(..) |
StatementKind::SetDiscriminant { .. } |
StatementKind::StorageLive(..) |
StatementKind::StorageDead(..) |
StatementKind::Assign(ref place, ref rvalue) => {
this.visit_assign(bb, place, rvalue, location);
}
- StatementKind::ReadForMatch(..) |
+ StatementKind::FakeRead(..) |
StatementKind::SetDiscriminant { .. } |
StatementKind::StorageLive(_) |
StatementKind::StorageDead(_) |
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(()),
) -> bool {
for stmt in &mir[bb].statements {
match stmt.kind {
- StatementKind::ReadForMatch(_) |
+ StatementKind::FakeRead(..) |
StatementKind::StorageLive(_) |
StatementKind::StorageDead(_) |
StatementKind::EndRegion(_) |
mir::StatementKind::Assign(ref place, ref rvalue) => {
(place, rvalue)
}
- mir::StatementKind::ReadForMatch(_) |
+ mir::StatementKind::FakeRead(..) |
mir::StatementKind::StorageLive(_) |
mir::StatementKind::StorageDead(_) |
mir::StatementKind::InlineAsm { .. } |
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",