Browse Source

Ensure NaN != any_float_value evaluates to true for constant NaN values

mtarik34b 4 months ago
parent
commit
313d7d84bc
2 changed files with 36 additions and 22 deletions
  1. 1 1
      src/exact_value.cpp
  2. 35 21
      tests/internal/test_5004_nan_constant_comparison.odin

+ 1 - 1
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) {

+ 35 - 21
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)
-}
+	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)
+}