From be18b8a7c8862064a4c268ab69f48f2c1672820b 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_value.rs | 2 +- 2 files changed, 2 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_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); }