Skip to content

Commit

Permalink
Move errors specify "dereference of raw pointer".
Browse files Browse the repository at this point in the history
Previously, move errors involving the dereference of a raw pointer would
say "borrowed content". This commit changes it to say "dereference of
raw pointer".
  • Loading branch information
davidtwco committed Oct 8, 2018
1 parent 61f5ca7 commit fe8ace8
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
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
@@ -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
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 fe8ace8

Please sign in to comment.