Browse Source

fixed override+abstract spec check for overloaded methods (#10024)

Aleksandr Kuzmenko 4 years ago
parent
commit
d2710dc88d
1 changed files with 4 additions and 3 deletions
  1. 4 3
      src/typing/typeloadCheck.ml

+ 4 - 3
src/typing/typeloadCheck.ml

@@ -174,6 +174,7 @@ let check_overriding ctx c f =
 		let check_field f get_super_field is_overload = try
 			(if is_overload && not (has_class_field_flag f CfOverload) then
 				display_error ctx ("Missing overload declaration for field " ^ i) p);
+			let f_has_override = has_class_field_flag f CfOverride in
 			let t, f2 = get_super_field csup i in
 			check_native_name_override ctx f f2;
 			(* allow to define fields that are not defined for this platform version in superclass *)
@@ -181,14 +182,14 @@ let check_overriding ctx c f =
 			| Var { v_read = AccRequire _ } -> raise Not_found;
 			| _ -> ());
 			if has_class_field_flag f2 CfAbstract then begin
-				if has_class_field_flag f CfOverride
-					then display_error ctx ("Field " ^ i ^ " is declared 'override' but parent field " ^ i ^ " is 'abstract' and does not provide any implementation to override") p
+				if f_has_override then
+					display_error ctx ("Field " ^ i ^ " is declared 'override' but parent field " ^ i ^ " is 'abstract' and does not provide any implementation to override") p
 				else
 					add_class_field_flag f CfOverride (* our spec requires users to not "override" abstract functions, but our implementation depends on implementations to be declared with "override" ¯\_(ツ)_/¯ *)
 			end;
 			if (has_class_field_flag f2 CfOverload && not (has_class_field_flag f CfOverload)) then
 				display_error ctx ("Field " ^ i ^ " should be declared with overload since it was already declared as overload in superclass") p
-			else if not (has_class_field_flag f CfOverride) then begin
+			else if not f_has_override && not (has_class_field_flag f2 CfAbstract) then begin
 				if has_class_flag c CExtern then add_class_field_flag f CfOverride
 				else display_error ctx ("Field " ^ i ^ " should be declared with 'override' since it is inherited from superclass " ^ s_type_path csup.cl_path) p
 			end else if not (has_class_field_flag f CfPublic) && (has_class_field_flag f2 CfPublic) then