diff options
| author | Ralf Jung <post@ralfj.de> | 2021-03-10 15:50:44 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2021-03-10 15:50:44 +0100 |
| commit | 55c88f594c433355164d3962c5ff10ba3501e6b7 (patch) | |
| tree | d76e7d2c4ac7b389e05225da7aa6c8326a309600 | |
| parent | a4d9624242df6bfe6c0a298867dd2bd527263424 (diff) | |
| download | rust-55c88f594c433355164d3962c5ff10ba3501e6b7.tar.gz rust-55c88f594c433355164d3962c5ff10ba3501e6b7.zip | |
fix error message for copy(_nonoverlapping) overflow
| -rw-r--r-- | compiler/rustc_mir/src/interpret/step.rs | 5 | ||||
| -rw-r--r-- | src/test/ui/consts/copy-intrinsic.rs | 16 | ||||
| -rw-r--r-- | src/test/ui/consts/copy-intrinsic.stderr | 34 |
3 files changed, 52 insertions, 3 deletions
diff --git a/compiler/rustc_mir/src/interpret/step.rs b/compiler/rustc_mir/src/interpret/step.rs index 2bed3b2c3ad..6084f67abd7 100644 --- a/compiler/rustc_mir/src/interpret/step.rs +++ b/compiler/rustc_mir/src/interpret/step.rs @@ -160,7 +160,10 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let layout = self.layout_of(src.layout.ty.builtin_deref(true).unwrap().ty)?; let (size, align) = (layout.size, layout.align.abi); let size = size.checked_mul(count, self).ok_or_else(|| { - err_ub_format!("overflow computing total size of `copy_nonoverlapping`") + err_ub_format!( + "overflow computing total size of `{}`", + if nonoverlapping { "copy_nonoverlapping" } else { "copy" } + ) })?; // Make sure we check both pointers for an access of the total size and aligment, diff --git a/src/test/ui/consts/copy-intrinsic.rs b/src/test/ui/consts/copy-intrinsic.rs index 6b46b9317d0..9dc595f37fa 100644 --- a/src/test/ui/consts/copy-intrinsic.rs +++ b/src/test/ui/consts/copy-intrinsic.rs @@ -1,6 +1,6 @@ // ignore-tidy-linelength #![feature(const_mut_refs, const_intrinsic_copy, const_ptr_offset)] -use std::ptr; +use std::{ptr, mem}; const COPY_ZERO: () = unsafe { // Since we are not copying anything, this should be allowed. @@ -26,6 +26,20 @@ const COPY_OOB_2: () = unsafe { //~| previously accepted }; +const COPY_SIZE_OVERFLOW: () = unsafe { + let x = 0; + let mut y = 0; + ptr::copy(&x, &mut y, 1usize << (mem::size_of::<usize>() * 8 - 1)); //~ ERROR any use of this value will cause an error + //~| overflow computing total size of `copy` + //~| previously accepted +}; +const COPY_NONOVERLAPPING_SIZE_OVERFLOW: () = unsafe { + let x = 0; + let mut y = 0; + ptr::copy_nonoverlapping(&x, &mut y, 1usize << (mem::size_of::<usize>() * 8 - 1)); //~ ERROR any use of this value will cause an error + //~| overflow computing total size of `copy_nonoverlapping` + //~| previously accepted +}; fn main() { } diff --git a/src/test/ui/consts/copy-intrinsic.stderr b/src/test/ui/consts/copy-intrinsic.stderr index 9157ba50dde..2736cdeac69 100644 --- a/src/test/ui/consts/copy-intrinsic.stderr +++ b/src/test/ui/consts/copy-intrinsic.stderr @@ -33,5 +33,37 @@ LL | | }; = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800> -error: aborting due to 2 previous errors +error: any use of this value will cause an error + --> $DIR/copy-intrinsic.rs:32:5 + | +LL | / const COPY_SIZE_OVERFLOW: () = unsafe { +LL | | let x = 0; +LL | | let mut y = 0; +LL | | ptr::copy(&x, &mut y, 1usize << (mem::size_of::<usize>() * 8 - 1)); + | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ overflow computing total size of `copy` +LL | | +LL | | +LL | | }; + | |__- + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800> + +error: any use of this value will cause an error + --> $DIR/copy-intrinsic.rs:39:5 + | +LL | / const COPY_NONOVERLAPPING_SIZE_OVERFLOW: () = unsafe { +LL | | let x = 0; +LL | | let mut y = 0; +LL | | ptr::copy_nonoverlapping(&x, &mut y, 1usize << (mem::size_of::<usize>() * 8 - 1)); + | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ overflow computing total size of `copy_nonoverlapping` +LL | | +LL | | +LL | | }; + | |__- + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800> + +error: aborting due to 4 previous errors |
