summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_transmute/src
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_transmute/src')
-rw-r--r--compiler/rustc_transmute/src/layout/tree.rs3
-rw-r--r--compiler/rustc_transmute/src/lib.rs15
-rw-r--r--compiler/rustc_transmute/src/maybe_transmutable/mod.rs2
3 files changed, 13 insertions, 7 deletions
diff --git a/compiler/rustc_transmute/src/layout/tree.rs b/compiler/rustc_transmute/src/layout/tree.rs
index e8ddb0a43..49f24f66b 100644
--- a/compiler/rustc_transmute/src/layout/tree.rs
+++ b/compiler/rustc_transmute/src/layout/tree.rs
@@ -189,6 +189,8 @@ pub(crate) mod rustc {
Unspecified,
/// This error will be surfaced elsewhere by rustc, so don't surface it.
UnknownLayout,
+ /// Overflow size
+ SizeOverflow,
TypeError(ErrorGuaranteed),
}
@@ -196,6 +198,7 @@ pub(crate) mod rustc {
fn from(err: &LayoutError<'tcx>) -> Self {
match err {
LayoutError::Unknown(..) | LayoutError::ReferencesError(..) => Self::UnknownLayout,
+ LayoutError::SizeOverflow(..) => Self::SizeOverflow,
err => unimplemented!("{:?}", err),
}
}
diff --git a/compiler/rustc_transmute/src/lib.rs b/compiler/rustc_transmute/src/lib.rs
index 05ad4a4a1..6c49e94dc 100644
--- a/compiler/rustc_transmute/src/lib.rs
+++ b/compiler/rustc_transmute/src/lib.rs
@@ -64,6 +64,10 @@ pub enum Reason {
SrcLayoutUnknown,
/// The layout of dst is unknown
DstLayoutUnknown,
+ /// The size of src is overflow
+ SrcSizeOverflow,
+ /// The size of dst is overflow
+ DstSizeOverflow,
}
#[cfg(feature = "rustc")]
@@ -125,19 +129,16 @@ mod rustc {
c: Const<'tcx>,
) -> Option<Self> {
use rustc_middle::ty::ScalarInt;
- use rustc_middle::ty::TypeVisitableExt;
use rustc_span::symbol::sym;
- let c = c.eval(tcx, param_env);
-
- if let Err(err) = c.error_reported() {
+ let Ok(cv) = c.eval(tcx, param_env, None) else {
return Some(Self {
alignment: true,
lifetimes: true,
safety: true,
validity: true,
});
- }
+ };
let adt_def = c.ty().ty_adt_def()?;
@@ -149,8 +150,8 @@ mod rustc {
);
let variant = adt_def.non_enum_variant();
- let fields = match c.try_to_valtree() {
- Some(ValTree::Branch(branch)) => branch,
+ let fields = match cv {
+ ValTree::Branch(branch) => branch,
_ => {
return Some(Self {
alignment: true,
diff --git a/compiler/rustc_transmute/src/maybe_transmutable/mod.rs b/compiler/rustc_transmute/src/maybe_transmutable/mod.rs
index b223a90f7..c0141f1f8 100644
--- a/compiler/rustc_transmute/src/maybe_transmutable/mod.rs
+++ b/compiler/rustc_transmute/src/maybe_transmutable/mod.rs
@@ -85,6 +85,8 @@ mod rustc {
(_, Err(Err::UnknownLayout)) => Answer::No(Reason::DstLayoutUnknown),
(Err(Err::Unspecified), _) => Answer::No(Reason::SrcIsUnspecified),
(_, 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)) => {
MaybeTransmutableQuery { src, dst, scope, assume, context }.answer()
}