2
0
Эх сурвалжийг харах

[typer] map type parameters when checking abstract methods

closes #9719
Simon Krajewski 5 жил өмнө
parent
commit
9dd457594a

+ 3 - 3
src/codegen/overloads.ml

@@ -71,7 +71,7 @@ let compare_overload_args ?(get_vmtype) ?(ctx) t1 t2 f1 f2 =
 let same_overload_args ?(get_vmtype) t1 t2 f1 f2 =
 	compare_overload_args ?get_vmtype t1 t2 f1 f2 <> Different
 
-let collect_overloads c i =
+let collect_overloads map c i =
 	let acc = ref [] in
 	let rec loop map c =
 		let maybe_add cf =
@@ -102,11 +102,11 @@ let collect_overloads c i =
 				let tl = List.map map tl in
 				loop (fun t -> apply_params c.cl_params tl (map t)) c
 	in
-	loop (fun t -> t) c;
+	loop map c;
 	List.rev !acc
 
 let get_overloads (com : Common.context) c i =
-	collect_overloads c i
+	collect_overloads (fun t -> t) c i
 	(* TODO: check why this kills Java *)
 	(* try
 		Hashtbl.find com.overload_cache (c.cl_path,i)

+ 2 - 1
src/typing/typeloadCheck.ml

@@ -410,6 +410,7 @@ module Inheritance = struct
 
 	let check_abstract_class ctx c csup params =
 		let missing = ref [] in
+		let map = apply_params csup.cl_params params in
 		let check_abstract_class_field cf1 t1 =
 			try
 				let cf2 = PMap.find cf1.cf_name c.cl_fields in
@@ -422,7 +423,7 @@ module Inheritance = struct
 		in
 		let cfl = TClass.get_all_fields csup params in
 		PMap.iter (fun _ (_,cf) ->
-			let cfl = Overloads.collect_overloads csup cf.cf_name in
+			let cfl = Overloads.collect_overloads map csup cf.cf_name in
 			List.iter (fun (t,cf) ->
 				if (has_class_field_flag cf CfAbstract) then
 					check_abstract_class_field cf t

+ 30 - 0
tests/unit/src/unit/issues/Issue9719.hx

@@ -0,0 +1,30 @@
+package unit.issues;
+
+private abstract class Parent<K> {
+	public function new() {}
+	public abstract function put(k:K):Bool;
+}
+
+private class Child<K> extends Parent<K> {
+	public override function put(k:K) {
+		return true;
+	}
+}
+
+private class Child2<K> extends Parent<String> {
+	public override function put(k:String) {
+		return true;
+	}
+}
+
+class Issue9719 extends unit.Test {
+	function test() {
+		var child = new Child();
+		t(child.put(null));
+		var parent:Parent<String> = child;
+		t(parent.put(null));
+
+		var child2 = new Child2();
+		t(child2.put("foo"));
+	}
+}