From fe45569b7528dfac7a43eb4126e336a17c5fdb9d Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Wed, 25 Oct 2023 10:35:13 -0700 Subject: [PATCH] Ensure that .nan deserialization produces positive NaN --- src/de.rs | 2 +- tests/test_de.rs | 1 + tests/test_value.rs | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/de.rs b/src/de.rs index 43f46781..566f5f00 100644 --- a/src/de.rs +++ b/src/de.rs @@ -1079,7 +1079,7 @@ pub(crate) fn parse_f64(scalar: &str) -> Option { return Some(f64::NEG_INFINITY); } if let ".nan" | ".NaN" | ".NAN" = scalar { - return Some(f64::NAN); + return Some(f64::NAN.copysign(1.0)); } if let Ok(float) = unpositive.parse::() { if float.is_finite() { diff --git a/tests/test_de.rs b/tests/test_de.rs index 840188fb..44d10476 100644 --- a/tests/test_de.rs +++ b/tests/test_de.rs @@ -690,6 +690,7 @@ fn test_parse_number() { let n = ".nan".parse::().unwrap(); assert_eq!(n, Number::from(f64::NAN)); + assert!(n.as_f64().unwrap().is_sign_positive()); let n = ".inf".parse::().unwrap(); assert_eq!(n, Number::from(f64::INFINITY)); diff --git a/tests/test_value.rs b/tests/test_value.rs index a7dd448c..cce8329b 100644 --- a/tests/test_value.rs +++ b/tests/test_value.rs @@ -20,7 +20,7 @@ fn test_nan() { assert!(neg_fake_nan.is_string()); let significand_mask = 0xF_FFFF_FFFF_FFFF; - let bits = (f64::NAN.to_bits() ^ significand_mask) | 1; + let bits = (f64::NAN.copysign(1.0).to_bits() ^ significand_mask) | 1; let different_pos_nan = Value::Number(Number::from(f64::from_bits(bits))); assert_eq!(pos_nan, different_pos_nan); }