Auto merge of #115529 - chenyukang:yukang-fix-115402-overflowsize, r=compiler-errors
Fix error report for size overflow from transmute Fixes #115402 The span in the error reporting always points to the `dst`, this is an old issue, I may open another PR to fix it.
This commit is contained in:
commit
aeddd2ddfd
@ -2920,6 +2920,16 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
|||||||
rustc_transmute::Reason::DstIsTooBig => {
|
rustc_transmute::Reason::DstIsTooBig => {
|
||||||
format!("The size of `{src}` is smaller than the size of `{dst}`")
|
format!("The size of `{src}` is smaller than the size of `{dst}`")
|
||||||
}
|
}
|
||||||
|
rustc_transmute::Reason::SrcSizeOverflow => {
|
||||||
|
format!(
|
||||||
|
"values of the type `{src}` are too big for the current architecture"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
rustc_transmute::Reason::DstSizeOverflow => {
|
||||||
|
format!(
|
||||||
|
"values of the type `{dst}` are too big for the current architecture"
|
||||||
|
)
|
||||||
|
}
|
||||||
rustc_transmute::Reason::DstHasStricterAlignment {
|
rustc_transmute::Reason::DstHasStricterAlignment {
|
||||||
src_min_align,
|
src_min_align,
|
||||||
dst_min_align,
|
dst_min_align,
|
||||||
|
@ -189,6 +189,8 @@ pub(crate) mod rustc {
|
|||||||
Unspecified,
|
Unspecified,
|
||||||
/// This error will be surfaced elsewhere by rustc, so don't surface it.
|
/// This error will be surfaced elsewhere by rustc, so don't surface it.
|
||||||
UnknownLayout,
|
UnknownLayout,
|
||||||
|
/// Overflow size
|
||||||
|
SizeOverflow,
|
||||||
TypeError(ErrorGuaranteed),
|
TypeError(ErrorGuaranteed),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,6 +198,7 @@ pub(crate) mod rustc {
|
|||||||
fn from(err: &LayoutError<'tcx>) -> Self {
|
fn from(err: &LayoutError<'tcx>) -> Self {
|
||||||
match err {
|
match err {
|
||||||
LayoutError::Unknown(..) | LayoutError::ReferencesError(..) => Self::UnknownLayout,
|
LayoutError::Unknown(..) | LayoutError::ReferencesError(..) => Self::UnknownLayout,
|
||||||
|
LayoutError::SizeOverflow(..) => Self::SizeOverflow,
|
||||||
err => unimplemented!("{:?}", err),
|
err => unimplemented!("{:?}", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,10 @@ pub enum Reason {
|
|||||||
SrcLayoutUnknown,
|
SrcLayoutUnknown,
|
||||||
/// The layout of dst is unknown
|
/// The layout of dst is unknown
|
||||||
DstLayoutUnknown,
|
DstLayoutUnknown,
|
||||||
|
/// The size of src is overflow
|
||||||
|
SrcSizeOverflow,
|
||||||
|
/// The size of dst is overflow
|
||||||
|
DstSizeOverflow,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "rustc")]
|
#[cfg(feature = "rustc")]
|
||||||
|
@ -85,6 +85,8 @@ mod rustc {
|
|||||||
(_, Err(Err::UnknownLayout)) => Answer::No(Reason::DstLayoutUnknown),
|
(_, Err(Err::UnknownLayout)) => Answer::No(Reason::DstLayoutUnknown),
|
||||||
(Err(Err::Unspecified), _) => Answer::No(Reason::SrcIsUnspecified),
|
(Err(Err::Unspecified), _) => Answer::No(Reason::SrcIsUnspecified),
|
||||||
(_, Err(Err::Unspecified)) => Answer::No(Reason::DstIsUnspecified),
|
(_, Err(Err::Unspecified)) => Answer::No(Reason::DstIsUnspecified),
|
||||||
|
(Err(Err::SizeOverflow), _) => Answer::No(Reason::SrcSizeOverflow),
|
||||||
|
(_, Err(Err::SizeOverflow)) => Answer::No(Reason::DstSizeOverflow),
|
||||||
(Ok(src), Ok(dst)) => {
|
(Ok(src), Ok(dst)) => {
|
||||||
MaybeTransmutableQuery { src, dst, scope, assume, context }.answer()
|
MaybeTransmutableQuery { src, dst, scope, assume, context }.answer()
|
||||||
}
|
}
|
||||||
|
27
tests/ui/transmute/issue-115402-overflow-size.rs
Normal file
27
tests/ui/transmute/issue-115402-overflow-size.rs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#![crate_type = "lib"]
|
||||||
|
#![feature(transmutability)]
|
||||||
|
mod assert {
|
||||||
|
use std::mem::BikeshedIntrinsicFrom;
|
||||||
|
struct Context;
|
||||||
|
|
||||||
|
pub fn is_maybe_transmutable<Src, Dst>()
|
||||||
|
where
|
||||||
|
Dst: BikeshedIntrinsicFrom<Src, Context>,
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
pub union Uninit {
|
||||||
|
a: [u8; usize::MAX],
|
||||||
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
struct ExplicitlyPadded(Uninit);
|
||||||
|
|
||||||
|
assert::is_maybe_transmutable::<(), ExplicitlyPadded>();
|
||||||
|
//~^ ERROR `()` cannot be safely transmuted into `ExplicitlyPadded`
|
||||||
|
|
||||||
|
assert::is_maybe_transmutable::<ExplicitlyPadded, ()>();
|
||||||
|
//~^ ERROR `ExplicitlyPadded` cannot be safely transmuted into `()`
|
||||||
|
}
|
33
tests/ui/transmute/issue-115402-overflow-size.stderr
Normal file
33
tests/ui/transmute/issue-115402-overflow-size.stderr
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
error[E0277]: `()` cannot be safely transmuted into `ExplicitlyPadded` in the defining scope of `assert::Context`
|
||||||
|
--> $DIR/issue-115402-overflow-size.rs:22:41
|
||||||
|
|
|
||||||
|
LL | assert::is_maybe_transmutable::<(), ExplicitlyPadded>();
|
||||||
|
| ^^^^^^^^^^^^^^^^ values of the type `ExplicitlyPadded` are too big for the current architecture
|
||||||
|
|
|
||||||
|
note: required by a bound in `is_maybe_transmutable`
|
||||||
|
--> $DIR/issue-115402-overflow-size.rs:9:14
|
||||||
|
|
|
||||||
|
LL | pub fn is_maybe_transmutable<Src, Dst>()
|
||||||
|
| --------------------- required by a bound in this function
|
||||||
|
LL | where
|
||||||
|
LL | Dst: BikeshedIntrinsicFrom<Src, Context>,
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `is_maybe_transmutable`
|
||||||
|
|
||||||
|
error[E0277]: `ExplicitlyPadded` cannot be safely transmuted into `()` in the defining scope of `assert::Context`
|
||||||
|
--> $DIR/issue-115402-overflow-size.rs:25:55
|
||||||
|
|
|
||||||
|
LL | assert::is_maybe_transmutable::<ExplicitlyPadded, ()>();
|
||||||
|
| ^^ values of the type `ExplicitlyPadded` are too big for the current architecture
|
||||||
|
|
|
||||||
|
note: required by a bound in `is_maybe_transmutable`
|
||||||
|
--> $DIR/issue-115402-overflow-size.rs:9:14
|
||||||
|
|
|
||||||
|
LL | pub fn is_maybe_transmutable<Src, Dst>()
|
||||||
|
| --------------------- required by a bound in this function
|
||||||
|
LL | where
|
||||||
|
LL | Dst: BikeshedIntrinsicFrom<Src, Context>,
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `is_maybe_transmutable`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
Loading…
x
Reference in New Issue
Block a user