Browse Source

[nullsafety] respect @:nullSafety(Off) in closures in constructors
closes #9643

Aleksandr Kuzmenko 5 years ago
parent
commit
c6dabfcc92
2 changed files with 14 additions and 1 deletions
  1. 1 1
      src/typing/nullSafety.ml
  2. 13 0
      tests/nullsafety/src/cases/TestStrict.hx

+ 1 - 1
src/typing/nullSafety.ml

@@ -1608,7 +1608,7 @@ class class_checker cls immediate_execution report =
 							List.iter (check_unsafe_usage init_list safety_enabled) args
 							List.iter (check_unsafe_usage init_list safety_enabled) args
 						| TConst TThis when safety_enabled ->
 						| TConst TThis when safety_enabled ->
 							checker#error "Cannot use \"this\" until all instance fields are initialized." [e.epos]
 							checker#error "Cannot use \"this\" until all instance fields are initialized." [e.epos]
-						| TLocal v when Hashtbl.mem this_vars v.v_id ->
+						| TLocal v when safety_enabled && Hashtbl.mem this_vars v.v_id ->
 							checker#error "Cannot use \"this\" until all instance fields are initialized." [e.epos]
 							checker#error "Cannot use \"this\" until all instance fields are initialized." [e.epos]
 						| TMeta ((Meta.NullSafety, [(EConst (Ident "Off"), _)], _), e) ->
 						| TMeta ((Meta.NullSafety, [(EConst (Ident "Off"), _)], _), e) ->
 							iter (check_unsafe_usage init_list false) e
 							iter (check_unsafe_usage init_list false) e

+ 13 - 0
tests/nullsafety/src/cases/TestStrict.hx

@@ -78,6 +78,19 @@ private class TestWithoutConstructor {
 	@:shouldFail var notInitializedField:String;
 	@:shouldFail var notInitializedField:String;
 }
 }
 
 
+class Issue9643 {
+	static var tmp:Null<()->Void>;
+
+	final field: String;
+
+	public function new() {
+		tmp = () -> @:nullSafety(Off) method();
+		field = 'hello';
+	}
+
+	function method() {}
+}
+
 class AllVarsInitializedInConstructor_weHaveClosure_thisShouldBeUsable {
 class AllVarsInitializedInConstructor_weHaveClosure_thisShouldBeUsable {
 	var v:Int;
 	var v:Int;