Skip to content
This repository was archived by the owner on Mar 25, 2024. It is now read-only.

Commit d094ba1

Browse files
authored
Merge pull request #392 from dtolnay/positivenan
Ensure that .nan deserialization produces positive NaN
2 parents 81b2d76 + fe45569 commit d094ba1

File tree

3 files changed

+3
-2
lines changed

3 files changed

+3
-2
lines changed

src/de.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,7 @@ pub(crate) fn parse_f64(scalar: &str) -> Option<f64> {
10791079
return Some(f64::NEG_INFINITY);
10801080
}
10811081
if let ".nan" | ".NaN" | ".NAN" = scalar {
1082-
return Some(f64::NAN);
1082+
return Some(f64::NAN.copysign(1.0));
10831083
}
10841084
if let Ok(float) = unpositive.parse::<f64>() {
10851085
if float.is_finite() {

tests/test_de.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,7 @@ fn test_parse_number() {
690690

691691
let n = ".nan".parse::<Number>().unwrap();
692692
assert_eq!(n, Number::from(f64::NAN));
693+
assert!(n.as_f64().unwrap().is_sign_positive());
693694

694695
let n = ".inf".parse::<Number>().unwrap();
695696
assert_eq!(n, Number::from(f64::INFINITY));

tests/test_value.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ fn test_nan() {
2020
assert!(neg_fake_nan.is_string());
2121

2222
let significand_mask = 0xF_FFFF_FFFF_FFFF;
23-
let bits = (f64::NAN.to_bits() ^ significand_mask) | 1;
23+
let bits = (f64::NAN.copysign(1.0).to_bits() ^ significand_mask) | 1;
2424
let different_pos_nan = Value::Number(Number::from(f64::from_bits(bits)));
2525
assert_eq!(pos_nan, different_pos_nan);
2626
}

0 commit comments

Comments
 (0)