Browse Source

[macro] fix NaN compares (closes #4776)

Simon Krajewski 9 years ago
parent
commit
aeeb3be4f5
2 changed files with 54 additions and 1 deletions
  1. 1 1
      interp.ml
  2. 53 0
      tests/unit/src/unitstd/Float.unit.hx

+ 1 - 1
interp.ml

@@ -3535,7 +3535,7 @@ let rec to_string ctx n v =
 			Buffer.contents b
 
 let rec compare ctx a b =
-	let fcmp (a:float) b = if a = b then CEq else if a < b then CInf else CSup in
+	let fcmp (a:float) b = if a = b then CEq else if a < b then CInf else if a > b then CSup else CUndef in
 	let scmp (a:string) b = if a = b then CEq else if a < b then CInf else CSup in
 	let icmp (a:int32) b = let l = Int32.compare a b in if l = 0 then CEq else if l < 0 then CInf else CSup in
 	match a, b with

+ 53 - 0
tests/unit/src/unitstd/Float.unit.hx

@@ -0,0 +1,53 @@
+var nan = Math.NaN;
+var pinf = Math.POSITIVE_INFINITY;
+var ninf = Math.NEGATIVE_INFINITY;
+var fl:Float = 0.0;
+
+fl > nan == false;
+fl < nan == false;
+fl >= nan == false;
+fl <= nan == false;
+fl == nan == false;
+fl != nan == true;
+
+nan > nan == false;
+nan < nan == false;
+nan >= nan == false;
+nan <= nan == false;
+nan == nan == false;
+nan != nan == true;
+
+pinf > nan == false;
+pinf < nan == false;
+pinf >= nan == false;
+pinf <= nan == false;
+pinf == nan == false;
+pinf != nan == true;
+
+ninf > nan == false;
+ninf < nan == false;
+ninf >= nan == false;
+ninf <= nan == false;
+ninf == nan == false;
+ninf != nan == true;
+
+nan > fl == false;
+nan < fl == false;
+nan >= fl == false;
+nan <= fl == false;
+nan == fl == false;
+nan != fl == true;
+
+nan > pinf == false;
+nan < pinf == false;
+nan >= pinf == false;
+nan <= pinf == false;
+nan == pinf == false;
+nan != pinf == true;
+
+nan > ninf == false;
+nan < ninf == false;
+nan >= ninf == false;
+nan <= ninf == false;
+nan == ninf == false;
+nan != ninf == true;