From 55c88f594c433355164d3962c5ff10ba3501e6b7 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Wed, 10 Mar 2021 15:50:44 +0100 Subject: [PATCH] fix error message for copy(_nonoverlapping) overflow --- compiler/rustc_mir/src/interpret/step.rs | 5 +++- src/test/ui/consts/copy-intrinsic.rs | 16 ++++++++++- 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 @@ pub(crate) fn copy( 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 @@ //~| previously accepted }; +const COPY_SIZE_OVERFLOW: () = unsafe { + let x = 0; + let mut y = 0; + ptr::copy(&x, &mut y, 1usize << (mem::size_of::() * 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::() * 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 -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::() * 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 + +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::() * 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 + +error: aborting due to 4 previous errors