aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormtarik34b <mtarik34b@gmail.com>2025-04-15 05:00:36 +0200
committermtarik34b <mtarik34b@gmail.com>2025-04-15 05:00:36 +0200
commit313d7d84bcfe086201640d23b449b77bdc08b135 (patch)
tree06879553f9b871775cb84f4e169eeafd2091a142
parent11da543f26fff002da8281757f141f6a5f690666 (diff)
Ensure NaN != any_float_value evaluates to true for constant NaN values
-rw-r--r--src/exact_value.cpp2
-rw-r--r--tests/internal/test_5004_nan_constant_comparison.odin56
2 files changed, 36 insertions, 22 deletions
diff --git a/src/exact_value.cpp b/src/exact_value.cpp
index f4439688c..e7981a978 100644
--- a/src/exact_value.cpp
+++ b/src/exact_value.cpp
@@ -955,7 +955,7 @@ gb_internal bool compare_exact_values(TokenKind op, ExactValue x, ExactValue y)
f64 a = x.value_float;
f64 b = y.value_float;
if (isnan(a) || isnan(b)) {
- return false; // Fixes #5004
+ return op == Token_NotEq; // Fixes #5004
}
switch (op) {
diff --git a/tests/internal/test_5004_nan_constant_comparison.odin b/tests/internal/test_5004_nan_constant_comparison.odin
index 2fbefb2b1..4eb3163a8 100644
--- a/tests/internal/test_5004_nan_constant_comparison.odin
+++ b/tests/internal/test_5004_nan_constant_comparison.odin
@@ -4,30 +4,44 @@ import "core:testing"
@(test)
compare_constant_nans_f32 :: proc(t: ^testing.T) {
- NaN :: f32(0h7fc0_0000)
- NaN2 :: f32(0h7fc0_0001)
+ NaN :: f32(0h7fc0_0000)
+ NaN2 :: f32(0h7fc0_0001)
+ Inf :: f32(0h7F80_0000)
+ Neg_Inf :: f32(0hFF80_0000)
- testing.expect_value(t, NaN == NaN, false)
- testing.expect_value(t, NaN == NaN2, false)
- testing.expect_value(t, NaN != NaN, false)
- testing.expect_value(t, NaN != NaN2, false)
- testing.expect_value(t, NaN < NaN, false)
- testing.expect_value(t, NaN <= NaN, false)
- testing.expect_value(t, NaN > NaN, false)
- testing.expect_value(t, NaN >= NaN, false)
+ testing.expect_value(t, NaN == NaN, false)
+ testing.expect_value(t, NaN == NaN2, false)
+ testing.expect_value(t, NaN != 0, true)
+ testing.expect_value(t, NaN != 5, true)
+ testing.expect_value(t, NaN != -5, true)
+ testing.expect_value(t, NaN != NaN, true)
+ testing.expect_value(t, NaN != NaN2, true)
+ testing.expect_value(t, NaN != Inf, true)
+ testing.expect_value(t, NaN != Neg_Inf, true)
+ testing.expect_value(t, NaN < NaN, false)
+ testing.expect_value(t, NaN <= NaN, false)
+ testing.expect_value(t, NaN > NaN, false)
+ testing.expect_value(t, NaN >= NaN, false)
}
@(test)
compare_constant_nans_f64 :: proc(t: ^testing.T) {
- NaN :: f64(0h7fff_0000_0000_0000)
- NaN2 :: f64(0h7fff_0000_0000_0001)
+ NaN :: f64(0h7fff_0000_0000_0000)
+ NaN2 :: f64(0h7fff_0000_0000_0001)
+ Inf :: f64(0h7FF0_0000_0000_0000)
+ Neg_Inf :: f64(0hFFF0_0000_0000_0000)
- testing.expect_value(t, NaN == NaN, false)
- testing.expect_value(t, NaN == NaN2, false)
- testing.expect_value(t, NaN != NaN, false)
- testing.expect_value(t, NaN != NaN2, false)
- testing.expect_value(t, NaN < NaN, false)
- testing.expect_value(t, NaN <= NaN, false)
- testing.expect_value(t, NaN > NaN, false)
- testing.expect_value(t, NaN >= NaN, false)
-} \ No newline at end of file
+ testing.expect_value(t, NaN == NaN, false)
+ testing.expect_value(t, NaN == NaN2, false)
+ testing.expect_value(t, NaN != 0, true)
+ testing.expect_value(t, NaN != 5, true)
+ testing.expect_value(t, NaN != -5, true)
+ testing.expect_value(t, NaN != NaN, true)
+ testing.expect_value(t, NaN != NaN2, true)
+ testing.expect_value(t, NaN != Inf, true)
+ testing.expect_value(t, NaN != Neg_Inf, true)
+ testing.expect_value(t, NaN < NaN, false)
+ testing.expect_value(t, NaN <= NaN, false)
+ testing.expect_value(t, NaN > NaN, false)
+ testing.expect_value(t, NaN >= NaN, false)
+}