Don't mix feature gates and hard errors, decide on one per op and stick with it

This commit is contained in:
oli
2020-12-30 17:44:11 +00:00
parent 3ed14033f7
commit aaee3f27ee
2 changed files with 18 additions and 15 deletions

View File

@@ -582,14 +582,24 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> {
);
if borrowed_place_has_mut_interior {
// Locals without StorageDead follow the "enclosing scope" rule, meaning
// they are essentially anonymous static items themselves.
// Note: This is only sound if every local that has a `StorageDead` has a
// `StorageDead` in every control flow path leading to a `return` terminator.
if self.local_has_storage_dead(place.local) {
self.check_op(ops::TransientCellBorrow);
} else {
self.check_op(ops::CellBorrow);
match self.const_kind() {
// In a const fn all borrows are transient or point to the places given via
// references in the arguments. The borrow checker guarantees that.
// NOTE: Once we have heap allocations during CTFE we need to figure out
// how to prevent `const fn` to create long-lived allocations that point
// to (interior) mutable memory.
hir::ConstContext::ConstFn => self.check_op(ops::TransientCellBorrow),
_ => {
// Locals without StorageDead follow the "enclosing scope" rule, meaning
// they are essentially anonymous static items themselves.
// Note: This is only sound if every local that has a `StorageDead` has a
// `StorageDead` in every control flow path leading to a `return` terminator.
if self.local_has_storage_dead(place.local) {
self.check_op(ops::TransientCellBorrow);
} else {
self.check_op(ops::CellBorrow);
}
}
}
}
}