From 94d0d91c7bd5b65fef08fdb15c25f12b00159e65 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Sat, 2 Jul 2022 22:20:22 +0000 Subject: [PATCH] Implement float literals in valtree --- compiler/rustc_mir_build/src/build/mod.rs | 14 ++++++++++++-- compiler/rustc_mir_build/src/thir/constant.rs | 8 ++++++++ src/test/ui/const-generics/issues/issue-98813.rs | 13 +++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/test/ui/const-generics/issues/issue-98813.rs diff --git a/compiler/rustc_mir_build/src/build/mod.rs b/compiler/rustc_mir_build/src/build/mod.rs index e27761381f633..6905642f5984a 100644 --- a/compiler/rustc_mir_build/src/build/mod.rs +++ b/compiler/rustc_mir_build/src/build/mod.rs @@ -1104,6 +1104,16 @@ pub(crate) fn parse_float_into_scalar( float_ty: ty::FloatTy, neg: bool, ) -> Option { + parse_float_into(num, float_ty, neg, |f| Scalar::from_f32(f), |f| Scalar::from_f64(f)) +} + +pub(crate) fn parse_float_into( + num: Symbol, + float_ty: ty::FloatTy, + neg: bool, + on_f32: impl FnOnce(Single) -> T, + on_f64: impl FnOnce(Double) -> T, +) -> Option { let num = num.as_str(); match float_ty { ty::FloatTy::F32 => { @@ -1127,7 +1137,7 @@ pub(crate) fn parse_float_into_scalar( f = -f; } - Some(Scalar::from_f32(f)) + Some(on_f32(f)) } ty::FloatTy::F64 => { let Ok(rust_f) = num.parse::() else { return None }; @@ -1150,7 +1160,7 @@ pub(crate) fn parse_float_into_scalar( f = -f; } - Some(Scalar::from_f64(f)) + Some(on_f64(f)) } } } diff --git a/compiler/rustc_mir_build/src/thir/constant.rs b/compiler/rustc_mir_build/src/thir/constant.rs index a7e4403a242e1..1453159e54275 100644 --- a/compiler/rustc_mir_build/src/thir/constant.rs +++ b/compiler/rustc_mir_build/src/thir/constant.rs @@ -1,7 +1,10 @@ +use rustc_apfloat::Float; use rustc_ast as ast; use rustc_middle::mir::interpret::{LitToConstError, LitToConstInput}; use rustc_middle::ty::{self, ParamEnv, ScalarInt, TyCtxt}; +use crate::build::parse_float_into; + pub(crate) fn lit_to_const<'tcx>( tcx: TyCtxt<'tcx>, lit_input: LitToConstInput<'tcx>, @@ -42,6 +45,11 @@ pub(crate) fn lit_to_const<'tcx>( trunc(if neg { (*n as i128).overflowing_neg().0 as u128 } else { *n })?; ty::ValTree::from_scalar_int(scalar_int) } + (ast::LitKind::Float(n, _), ty::Float(fty)) => { + let bytes = parse_float_into(*n, *fty, neg, |f| f.to_bits(), |f| f.to_bits()) + .ok_or_else(|| LitToConstError::Reported)?; + ty::ValTree::from_scalar_int(trunc(bytes)?) + } (ast::LitKind::Bool(b), ty::Bool) => ty::ValTree::from_scalar_int((*b).into()), (ast::LitKind::Char(c), ty::Char) => ty::ValTree::from_scalar_int((*c).into()), (ast::LitKind::Err(_), _) => return Err(LitToConstError::Reported), diff --git a/src/test/ui/const-generics/issues/issue-98813.rs b/src/test/ui/const-generics/issues/issue-98813.rs new file mode 100644 index 0000000000000..c7a457cd190f4 --- /dev/null +++ b/src/test/ui/const-generics/issues/issue-98813.rs @@ -0,0 +1,13 @@ +// build-pass + +#![allow(incomplete_features)] +#![feature(adt_const_params)] + +const F: f64 = 12.5; + +pub fn func() {} + +fn main() { + let _ = func::<14.0>(); + let _ = func::(); +}