fix #103751: Fix capacity overflow issue during transmutability check
This commit is contained in:
parent
126dbdc9c7
commit
749afe57c3
@ -435,8 +435,8 @@ fn from_repr_c_variant(
|
||||
|
||||
// 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);
|
||||
|
29
src/test/ui/transmute/transmute-padding-ice.rs
Normal file
29
src/test/ui/transmute/transmute-padding-ice.rs
Normal file
@ -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
src/test/ui/transmute/transmute-padding-ice.stderr
Normal file
24
src/test/ui/transmute/transmute-padding-ice.stderr
Normal file
@ -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`.
|
Loading…
Reference in New Issue
Block a user