diff options
| author | Yuki Okushi <huyuumi.dev@gmail.com> | 2021-03-12 08:55:22 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-12 08:55:22 +0900 |
| commit | 14846d945d78987641aba1ec8c0c799b56c7da19 (patch) | |
| tree | 96755a5871af868afa1cbd69845f809756d2c269 /compiler | |
| parent | 5ab8f53a719269a6d53aa57fac869ed07c2c6859 (diff) | |
| parent | c69b108d2ab3c2b99b784590be34efcf89ec789a (diff) | |
| download | rust-14846d945d78987641aba1ec8c0c799b56c7da19.tar.gz rust-14846d945d78987641aba1ec8c0c799b56c7da19.zip | |
Rollup merge of #83018 - oli-obk:float_check, r=davidtwco
Reintroduce accidentally deleted assertions. These were removed in https://github.com/rust-lang/rust/pull/50198
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_mir_build/src/thir/constant.rs | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/compiler/rustc_mir_build/src/thir/constant.rs b/compiler/rustc_mir_build/src/thir/constant.rs index 969f7d1e3a4..ac93d042970 100644 --- a/compiler/rustc_mir_build/src/thir/constant.rs +++ b/compiler/rustc_mir_build/src/thir/constant.rs @@ -1,3 +1,4 @@ +use rustc_apfloat::Float; use rustc_ast as ast; use rustc_middle::mir::interpret::{ Allocation, ConstValue, LitToConstError, LitToConstInput, Scalar, @@ -61,20 +62,40 @@ fn parse_float<'tcx>(num: Symbol, fty: ty::FloatTy, neg: bool) -> Result<ConstVa use rustc_apfloat::ieee::{Double, Single}; let scalar = match fty { ty::FloatTy::F32 => { - num.parse::<f32>().map_err(|_| ())?; + let rust_f = num.parse::<f32>().map_err(|_| ())?; let mut f = num.parse::<Single>().unwrap_or_else(|e| { panic!("apfloat::ieee::Single failed to parse `{}`: {:?}", num, e) }); + assert!( + u128::from(rust_f.to_bits()) == f.to_bits(), + "apfloat::ieee::Single gave different result for `{}`: \ + {}({:#x}) vs Rust's {}({:#x})", + rust_f, + f, + f.to_bits(), + Single::from_bits(rust_f.to_bits().into()), + rust_f.to_bits() + ); if neg { f = -f; } Scalar::from_f32(f) } ty::FloatTy::F64 => { - num.parse::<f64>().map_err(|_| ())?; + let rust_f = num.parse::<f64>().map_err(|_| ())?; let mut f = num.parse::<Double>().unwrap_or_else(|e| { panic!("apfloat::ieee::Double failed to parse `{}`: {:?}", num, e) }); + assert!( + u128::from(rust_f.to_bits()) == f.to_bits(), + "apfloat::ieee::Double gave different result for `{}`: \ + {}({:#x}) vs Rust's {}({:#x})", + rust_f, + f, + f.to_bits(), + Double::from_bits(rust_f.to_bits().into()), + rust_f.to_bits() + ); if neg { f = -f; } |
