Quellcode durchsuchen

bring back "Cannot use abstract as value" error
fixes #8550

Aleksandr Kuzmenko vor 6 Jahren
Ursprung
Commit
a7f13173d8

+ 12 - 0
src/filters/filters.ml

@@ -385,6 +385,17 @@ let rec fix_return_dynamic_from_void_function ctx return_is_void e =
 		}
 	| _ -> Type.map_expr (fix_return_dynamic_from_void_function ctx return_is_void) e
 
+let check_abstract_as_value e =
+	let rec loop e =
+		match e.eexpr with
+		| TField ({ eexpr = TTypeExpr _ }, _) -> ()
+		| TTypeExpr(TClassDecl {cl_kind = KAbstractImpl a}) when not (Meta.has Meta.RuntimeValue a.a_meta) ->
+			error "Cannot use abstract as value" e.epos
+		| _ -> Type.iter loop e
+	in
+	loop e;
+	e
+
 (* PASS 1 end *)
 
 (* Saves a class state so it can be restored later, e.g. after DCE or native path rewrite *)
@@ -838,6 +849,7 @@ let run com tctx main =
 	let filters = [
 		fix_return_dynamic_from_void_function tctx true;
 		check_local_vars_init;
+		check_abstract_as_value;
 		if Common.defined com Define.OldConstructorInline then Optimizer.inline_constructors tctx else InlineConstructors.inline_constructors tctx;
 		Optimizer.reduce_expression tctx;
 		CapturedVars.captured_vars com;

+ 0 - 2
src/optimization/analyzerTexprTransformer.ml

@@ -173,8 +173,6 @@ let rec func ctx bb tf t p =
 			close_node g bb;
 			add_cfg_edge bb_func_end bb_next CFGGoto;
 			bb_next,ec
-		(*| TTypeExpr(TClassDecl {cl_kind = KAbstractImpl a}) when not (Meta.has Meta.RuntimeValue a.a_meta) ->
-			error "Cannot use abstract as value" e.epos*)
 		| TConst _ | TTypeExpr _ ->
 			bb,e
 		| TThrow _ | TReturn _ | TBreak | TContinue ->

+ 7 - 0
tests/misc/projects/Issue8550/Fail.hx

@@ -0,0 +1,7 @@
+class Fail {
+	static function main() {
+		trace(Dummy);
+	}
+}
+
+abstract Dummy(Int) {}

+ 5 - 0
tests/misc/projects/Issue8550/Success.hx

@@ -0,0 +1,5 @@
+class Fail {
+	static function main() {
+		trace(Int);
+	}
+}

+ 1 - 0
tests/misc/projects/Issue8550/compile-fail.hxml

@@ -0,0 +1 @@
+-main Fail

+ 1 - 0
tests/misc/projects/Issue8550/compile-fail.hxml.stderr

@@ -0,0 +1 @@
+Fail.hx:3: characters 9-14 : Cannot use abstract as value

+ 1 - 0
tests/misc/projects/Issue8550/compile.hxml

@@ -0,0 +1 @@
+-main Success