Skip to content

Commit

Permalink
Rollup merge of rust-lang#54825 - davidtwco:issue-52663-deref-raw-poi…
Browse files Browse the repository at this point in the history
…nter, r=pnkfelix

NLL says "borrowed content" instead of more precise "dereference of raw pointer"

Part of rust-lang#52663.

Previously, move errors involving the dereference of a raw pointer would
say "borrowed content". This commit changes it to say "dereference of
raw pointer".

r? @nikomatsakis
cc @pnkfelix
  • Loading branch information
Mark-Simulacrum committed Oct 11, 2018
2 parents e33cd16 + fe8ace8 commit 2bf3b94
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 6 deletions.
15 changes: 15 additions & 0 deletions src/librustc_mir/borrow_check/move_errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ enum GroupedMoveError<'tcx> {
enum BorrowedContentSource {
Arc,
Rc,
DerefRawPointer,
Other,
}

Expand All @@ -76,6 +77,7 @@ impl Display for BorrowedContentSource {
match *self {
BorrowedContentSource::Arc => write!(f, "an `Arc`"),
BorrowedContentSource::Rc => write!(f, "an `Rc`"),
BorrowedContentSource::DerefRawPointer => write!(f, "dereference of raw pointer"),
BorrowedContentSource::Other => write!(f, "borrowed content"),
}
}
Expand Down Expand Up @@ -279,6 +281,7 @@ impl<'a, 'gcx, 'tcx> MirBorrowckCtxt<'a, 'gcx, 'tcx> {
self.prefixes(&original_path, PrefixSet::All)
.any(|p| p.is_upvar_field_projection(self.mir, &self.infcx.tcx)
.is_some());
debug!("report: ty={:?}", ty);
match ty.sty {
ty::Array(..) | ty::Slice(..) =>
self.infcx.tcx.cannot_move_out_of_interior_noncopy(
Expand Down Expand Up @@ -582,6 +585,18 @@ impl<'a, 'gcx, 'tcx> MirBorrowckCtxt<'a, 'gcx, 'tcx> {
}
}

// If we didn't find an `Arc` or an `Rc`, then check specifically for
// a dereference of a place that has the type of a raw pointer.
// We can't use `place.ty(..).to_ty(..)` here as that strips away the raw pointer.
if let Place::Projection(box Projection {
base,
elem: ProjectionElem::Deref,
}) = place {
if base.ty(self.mir, self.infcx.tcx).to_ty(self.infcx.tcx).is_unsafe_ptr() {
return BorrowedContentSource::DerefRawPointer;
}
}

BorrowedContentSource::Other
}
}
4 changes: 2 additions & 2 deletions src/test/ui/borrowck/borrowck-move-from-unsafe-ptr.nll.stderr
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
error[E0507]: cannot move out of borrowed content
error[E0507]: cannot move out of dereference of raw pointer
--> $DIR/borrowck-move-from-unsafe-ptr.rs:13:13
|
LL | let y = *x; //~ ERROR cannot move out of dereference of raw pointer
| ^^
| |
| cannot move out of borrowed content
| cannot move out of dereference of raw pointer
| help: consider removing the `*`: `x`

error: aborting due to previous error
Expand Down
8 changes: 4 additions & 4 deletions src/test/ui/issues/issue-20801.nll.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,22 @@ LL | let b = unsafe { *imm_ref() };
| cannot move out of borrowed content
| help: consider removing the `*`: `imm_ref()`

error[E0507]: cannot move out of borrowed content
error[E0507]: cannot move out of dereference of raw pointer
--> $DIR/issue-20801.rs:42:22
|
LL | let c = unsafe { *mut_ptr() };
| ^^^^^^^^^^
| |
| cannot move out of borrowed content
| cannot move out of dereference of raw pointer
| help: consider removing the `*`: `mut_ptr()`

error[E0507]: cannot move out of borrowed content
error[E0507]: cannot move out of dereference of raw pointer
--> $DIR/issue-20801.rs:45:22
|
LL | let d = unsafe { *const_ptr() };
| ^^^^^^^^^^^^
| |
| cannot move out of borrowed content
| cannot move out of dereference of raw pointer
| help: consider removing the `*`: `const_ptr()`

error: aborting due to 4 previous errors
Expand Down

0 comments on commit 2bf3b94

Please sign in to comment.