소스 검색

[typer] allow write variance on final interface fields

closes #7827
Simon Krajewski 6 년 전
부모
커밋
dd1e265f83
2개의 변경된 파일25개의 추가작업 그리고 0개의 파일을 삭제
  1. 3 0
      src/typing/typeloadCheck.ml
  2. 22 0
      tests/unit/src/unit/issues/Issue7827.hx

+ 3 - 0
src/typing/typeloadCheck.ml

@@ -115,6 +115,9 @@ let valid_redefinition ctx f1 t1 f2 t2 = (* child, parent *)
 	| _,(Var { v_read = AccNo | AccNever }) ->
 	| _,(Var { v_read = AccNo | AccNever }) ->
 		(* read variance *)
 		(* read variance *)
 		valid t2 t1
 		valid t2 t1
+	| _,_ when has_class_field_flag f2 CfFinal ->
+		(* write variance *)
+		valid t1 t2
 	| _ , _ ->
 	| _ , _ ->
 		(* in case args differs, or if an interface var *)
 		(* in case args differs, or if an interface var *)
 		type_eq EqStrict t1 t2;
 		type_eq EqStrict t1 t2;

+ 22 - 0
tests/unit/src/unit/issues/Issue7827.hx

@@ -0,0 +1,22 @@
+package unit.issues;
+
+import utest.Assert;
+private class Base {}
+
+private class Child extends Base {
+    public function new() {}
+}
+
+private interface I {
+    final x:Base;
+}
+
+private class C implements I {
+	public final x:Child = new Child();
+}
+
+class Issue7827 extends unit.Test {
+	function test() {
+		Assert.pass();
+	}
+}