Browse Source

Fix inconsistent treatment of Null<T> with unify_min in if/ternary (#6955)

Ben Morris 7 years ago
parent
commit
64cab04cf3
2 changed files with 20 additions and 1 deletions
  1. 1 1
      src/typing/typer.ml
  2. 19 0
      tests/unit/src/unit/issues/Issue6836.hx

+ 1 - 1
src/typing/typer.ml

@@ -309,7 +309,7 @@ let rec unify_min_raise ctx (el:texpr list) : t =
 	| [] -> mk_mono()
 	| [e] -> e.etype
 	| _ ->
-		let rec chk_null e = is_null e.etype ||
+		let rec chk_null e = is_null e.etype || is_explicit_null e.etype ||
 			match e.eexpr with
 			| TConst TNull -> true
 			| TBlock el ->

+ 19 - 0
tests/unit/src/unit/issues/Issue6836.hx

@@ -0,0 +1,19 @@
+package unit.issues;
+
+import unit.HelperMacros.typeString;
+
+class Issue6836 extends Test {
+	function test() {
+		var v:Null<Int> = 1;
+		var e1 = Std.random(2) == 1 ? 2 : v;
+		eq(typeString(e1), "Null<Int>");
+		var e2 = Std.random(2) == 1 ? v : 2;
+		eq(typeString(e1), "Null<Int>");
+
+		var v:Null<String> = "abc";
+		var e1 = Std.random(2) == 1 ? "def" : v;
+		eq(typeString(e1), "Null<String>");
+		var e2 = Std.random(2) == 1 ? v : "def";
+		eq(typeString(e1), "Null<String>");
+	}
+}