Skip to content

Commit

Permalink
Rollup merge of #112520 - chenyukang:yukang-fix-112505, r=fee1-dead
Browse files Browse the repository at this point in the history
Fix the overflow issue for transmute_generic_consts

Fixes #112505
  • Loading branch information
matthiaskrgr committed Jun 14, 2023
2 parents 98f6e96 + 3bbc598 commit 269ea4b
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 1 deletion.
11 changes: 10 additions & 1 deletion compiler/rustc_hir_typeck/src/intrinsicck.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
7 changes: 7 additions & 0 deletions tests/ui/const-generics/issue-112505-overflow.rs
Original file line number Diff line number Diff line change
@@ -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() { }
12 changes: 12 additions & 0 deletions tests/ui/const-generics/issue-112505-overflow.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 269ea4b

Please sign in to comment.