summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_const_eval/src/interpret/cast.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
commitef24de24a82fe681581cc130f342363c47c0969a (patch)
tree0d494f7e1a38b95c92426f58fe6eaa877303a86c /compiler/rustc_const_eval/src/interpret/cast.rs
parentReleasing progress-linux version 1.74.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-ef24de24a82fe681581cc130f342363c47c0969a.tar.xz
rustc-ef24de24a82fe681581cc130f342363c47c0969a.zip
Merging upstream version 1.75.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_const_eval/src/interpret/cast.rs')
-rw-r--r--compiler/rustc_const_eval/src/interpret/cast.rs41
1 files changed, 28 insertions, 13 deletions
diff --git a/compiler/rustc_const_eval/src/interpret/cast.rs b/compiler/rustc_const_eval/src/interpret/cast.rs
index b9f88cf63..f4cb12c8d 100644
--- a/compiler/rustc_const_eval/src/interpret/cast.rs
+++ b/compiler/rustc_const_eval/src/interpret/cast.rs
@@ -8,7 +8,7 @@ use rustc_middle::ty::adjustment::PointerCoercion;
use rustc_middle::ty::layout::{IntegerExt, LayoutOf, TyAndLayout};
use rustc_middle::ty::{self, FloatTy, Ty, TypeAndMut};
use rustc_target::abi::Integer;
-use rustc_type_ir::sty::TyKind::*;
+use rustc_type_ir::TyKind::*;
use super::{
util::ensure_monomorphic_enough, FnVal, ImmTy, Immediate, InterpCx, Machine, OpTy, PlaceTy,
@@ -145,16 +145,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
assert!(dest.layout.is_sized());
assert_eq!(cast_ty, dest.layout.ty); // we otherwise ignore `cast_ty` enirely...
if src.layout.size != dest.layout.size {
- let src_bytes = src.layout.size.bytes();
- let dest_bytes = dest.layout.size.bytes();
- let src_ty = format!("{}", src.layout.ty);
- let dest_ty = format!("{}", dest.layout.ty);
throw_ub_custom!(
fluent::const_eval_invalid_transmute,
- src_bytes = src_bytes,
- dest_bytes = dest_bytes,
- src = src_ty,
- dest = dest_ty,
+ src_bytes = src.layout.size.bytes(),
+ dest_bytes = dest.layout.size.bytes(),
+ src = src.layout.ty,
+ dest = dest.layout.ty,
);
}
@@ -185,7 +181,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
src: &ImmTy<'tcx, M::Provenance>,
cast_to: TyAndLayout<'tcx>,
) -> InterpResult<'tcx, ImmTy<'tcx, M::Provenance>> {
- use rustc_type_ir::sty::TyKind::*;
+ use rustc_type_ir::TyKind::*;
let val = match src.layout.ty.kind() {
// Floating point
@@ -310,7 +306,22 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
where
F: Float + Into<Scalar<M::Provenance>> + FloatConvert<Single> + FloatConvert<Double>,
{
- use rustc_type_ir::sty::TyKind::*;
+ use rustc_type_ir::TyKind::*;
+
+ fn adjust_nan<
+ 'mir,
+ 'tcx: 'mir,
+ M: Machine<'mir, 'tcx>,
+ F1: rustc_apfloat::Float + FloatConvert<F2>,
+ F2: rustc_apfloat::Float,
+ >(
+ ecx: &InterpCx<'mir, 'tcx, M>,
+ f1: F1,
+ f2: F2,
+ ) -> F2 {
+ if f2.is_nan() { M::generate_nan(ecx, &[f1]) } else { f2 }
+ }
+
match *dest_ty.kind() {
// float -> uint
Uint(t) => {
@@ -330,9 +341,13 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
Scalar::from_int(v, size)
}
// float -> f32
- Float(FloatTy::F32) => Scalar::from_f32(f.convert(&mut false).value),
+ Float(FloatTy::F32) => {
+ Scalar::from_f32(adjust_nan(self, f, f.convert(&mut false).value))
+ }
// float -> f64
- Float(FloatTy::F64) => Scalar::from_f64(f.convert(&mut false).value),
+ Float(FloatTy::F64) => {
+ Scalar::from_f64(adjust_nan(self, f, f.convert(&mut false).value))
+ }
// That's it.
_ => span_bug!(self.cur_span(), "invalid float to {} cast", dest_ty),
}