Skip to content

Commit

Permalink
Auto merge of #103831 - chenyukang:yukang/fix-103751-ice, r=nagisa
Browse files Browse the repository at this point in the history
Fix capacity overflow issue during transmutability check

Fixes #103751
  • Loading branch information
bors committed Nov 5, 2022
2 parents b0f3940 + 749afe5 commit 6b8d9dd
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 2 deletions.
4 changes: 2 additions & 2 deletions compiler/rustc_transmute/src/layout/tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -436,8 +436,8 @@ pub(crate) mod rustc {

// finally: padding
let padding_span = trace_span!("adding trailing padding").entered();
let padding_needed = layout_summary.total_size - variant_layout.size();
if padding_needed > 0 {
if layout_summary.total_size > variant_layout.size() {
let padding_needed = layout_summary.total_size - variant_layout.size();
tree = tree.then(Self::padding(padding_needed));
};
drop(padding_span);
Expand Down
29 changes: 29 additions & 0 deletions src/test/ui/transmute/transmute-padding-ice.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#![crate_type = "lib"]
#![feature(transmutability)]
#![allow(dead_code)]

mod assert {
use std::mem::{Assume, BikeshedIntrinsicFrom};
pub struct Context;

pub fn is_maybe_transmutable<Src, Dst>()
where
Dst: BikeshedIntrinsicFrom<
Src,
Context,
{ Assume { alignment: true, lifetimes: true, safety: true, validity: true } },
>,
{
}
}

fn test() {
#[repr(C, align(2))]
struct A(u8, u8);

#[repr(C)]
struct B(u8, u8);

assert::is_maybe_transmutable::<B, A>();
//~^ ERROR cannot be safely transmuted
}
24 changes: 24 additions & 0 deletions src/test/ui/transmute/transmute-padding-ice.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
error[E0277]: `B` cannot be safely transmuted into `A` in the defining scope of `assert::Context`.
--> $DIR/transmute-padding-ice.rs:27:40
|
LL | assert::is_maybe_transmutable::<B, A>();
| ^ `B` cannot be safely transmuted into `A` in the defining scope of `assert::Context`.
|
= help: the trait `BikeshedIntrinsicFrom<B, assert::Context, Assume { alignment: true, lifetimes: true, safety: true, validity: true }>` is not implemented for `A`
note: required by a bound in `is_maybe_transmutable`
--> $DIR/transmute-padding-ice.rs:11:14
|
LL | pub fn is_maybe_transmutable<Src, Dst>()
| --------------------- required by a bound in this
LL | where
LL | Dst: BikeshedIntrinsicFrom<
| ______________^
LL | | Src,
LL | | Context,
LL | | { Assume { alignment: true, lifetimes: true, safety: true, validity: true } },
LL | | >,
| |_________^ required by this bound in `is_maybe_transmutable`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.

0 comments on commit 6b8d9dd

Please sign in to comment.