Browse Source

Merge branch 'master' of https://github.com/odin-lang/Odin

gingerBill 4 months ago
parent
commit
cfb8cc709c

+ 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;
 		}
 
 		switch (op) {

+ 0 - 33
tests/internal/test_5004_nan_constant_comparison.odin

@@ -1,33 +0,0 @@
-package test_internal
-
-import "core:testing"
-
-@(test)
-compare_constant_nans_f32 :: proc(t: ^testing.T) {
-	NaN  :: f32(0h7fc0_0000)
-	NaN2 :: f32(0h7fc0_0001)
-
-	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)
-}
-
-@(test)
-compare_constant_nans_f64 :: proc(t: ^testing.T) {
-	NaN  :: f64(0h7fff_0000_0000_0000)
-	NaN2 :: f64(0h7fff_0000_0000_0001)
-
-	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)
-}

+ 47 - 0
tests/internal/test_nan_constant_comparison.odin

@@ -0,0 +1,47 @@
+package test_internal
+
+import "core:testing"
+
+@(test)
+compare_constant_nans_f32 :: proc(t: ^testing.T) {
+	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 != 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)
+	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 != 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)
+}