瀏覽代碼

[cs] Make sure to cast a conditional operator to the base if class when using ?:

Closes #5466
Cauê Waneck 9 年之前
父節點
當前提交
7062c6b23c
共有 2 個文件被更改,包括 27 次插入2 次删除
  1. 10 2
      src/generators/gencs.ml
  2. 17 0
      tests/unit/src/unit/issues/Issue5466.hx

+ 10 - 2
src/generators/gencs.ml

@@ -1580,12 +1580,20 @@ let configure gen =
 					) el;
 					end_block w
 				| TIf (econd, e1, Some(eelse)) when was_in_value ->
+					let base = t_s e.etype in
 					write w "( ";
 					expr_s w (mk_paren econd);
 					write w " ? ";
-					expr_s w (mk_paren e1);
+					if t_s e1.etype <> base then
+						expr_s w (mk_cast e.etype e1)
+					else
+						expr_s w (mk_paren e1);
+
 					write w " : ";
-					expr_s w (mk_paren eelse);
+					if t_s eelse.etype <> base then
+						expr_s w (mk_cast e.etype eelse)
+					else
+						expr_s w (mk_paren eelse);
 					write w " )";
 				| TIf (econd, e1, eelse) ->
 					write w "if ";

+ 17 - 0
tests/unit/src/unit/issues/Issue5466.hx

@@ -0,0 +1,17 @@
+package unit.issues;
+
+class Issue5466 extends Test {
+  function test() {
+    var test:Base = (Math.random() > 0.5) ? new A() : new B();
+    t(Std.is(test, A) || Std.is(test, B));
+  }
+}
+
+private class Base {
+  public function new() {}
+}
+
+private class A extends Base {
+}
+private class B extends Base {
+}