diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-06-14 06:25:49 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-06-14 06:25:49 +0200 |
| commit | 269ea4bd6bd8075f60b0ad3d8d51d87dfa18643f (patch) | |
| tree | 8e16f2e494aff3fc0df7d3f293e2d15d0f54b2b7 | |
| parent | 98f6e9644bc008df72eeacbd6d8ba34fcda6422b (diff) | |
| parent | 3bbc598d16bbaab62ec3f460d1832236908607d8 (diff) | |
| download | rust-269ea4bd6bd8075f60b0ad3d8d51d87dfa18643f.tar.gz rust-269ea4bd6bd8075f60b0ad3d8d51d87dfa18643f.zip | |
Rollup merge of #112520 - chenyukang:yukang-fix-112505, r=fee1-dead
Fix the overflow issue for transmute_generic_consts Fixes #112505
| -rw-r--r-- | compiler/rustc_hir_typeck/src/intrinsicck.rs | 11 | ||||
| -rw-r--r-- | tests/ui/const-generics/issue-112505-overflow.rs | 7 | ||||
| -rw-r--r-- | tests/ui/const-generics/issue-112505-overflow.stderr | 12 |
3 files changed, 29 insertions, 1 deletions
diff --git a/compiler/rustc_hir_typeck/src/intrinsicck.rs b/compiler/rustc_hir_typeck/src/intrinsicck.rs index 3c5eafd9484..362c07431e0 100644 --- a/compiler/rustc_hir_typeck/src/intrinsicck.rs +++ b/compiler/rustc_hir_typeck/src/intrinsicck.rs @@ -82,8 +82,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // Try to display a sensible error with as much information as possible. let skeleton_string = |ty: Ty<'tcx>, sk| match sk { - Ok(SizeSkeleton::Known(size)) => format!("{} bits", size.bits()), Ok(SizeSkeleton::Pointer { tail, .. }) => format!("pointer to `{tail}`"), + Ok(SizeSkeleton::Known(size)) => { + if let Some(v) = u128::from(size.bytes()).checked_mul(8) { + format!("{} bits", v) + } else { + // `u128` should definitely be able to hold the size of different architectures + // larger sizes should be reported as error `are too big for the current architecture` + // otherwise we have a bug somewhere + bug!("{:?} overflow for u128", size) + } + } Ok(SizeSkeleton::Generic(size)) => { if let Some(size) = size.try_eval_target_usize(tcx, self.param_env) { format!("{size} bytes") diff --git a/tests/ui/const-generics/issue-112505-overflow.rs b/tests/ui/const-generics/issue-112505-overflow.rs new file mode 100644 index 00000000000..0dd7776d595 --- /dev/null +++ b/tests/ui/const-generics/issue-112505-overflow.rs @@ -0,0 +1,7 @@ +#![feature(transmute_generic_consts)] + +fn overflow(v: [[[u32; 8888888]; 9999999]; 777777777]) -> [[[u32; 9999999]; 777777777]; 239] { + unsafe { std::mem::transmute(v) } //~ ERROR cannot transmute between types of different sizes +} + +fn main() { } diff --git a/tests/ui/const-generics/issue-112505-overflow.stderr b/tests/ui/const-generics/issue-112505-overflow.stderr new file mode 100644 index 00000000000..0432f2fa8be --- /dev/null +++ b/tests/ui/const-generics/issue-112505-overflow.stderr @@ -0,0 +1,12 @@ +error[E0512]: cannot transmute between types of different sizes, or dependently-sized types + --> $DIR/issue-112505-overflow.rs:4:14 + | +LL | unsafe { std::mem::transmute(v) } + | ^^^^^^^^^^^^^^^^^^^ + | + = note: source type: `[[[u32; 8888888]; 9999999]; 777777777]` (values of the type `[[[u32; 8888888]; 9999999]; 777777777]` are too big for the current architecture) + = note: target type: `[[[u32; 9999999]; 777777777]; 239]` (59484438436515561504 bits) + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0512`. |
