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

[analyzer] disallow Void in compound block expressions

closes #11391
see #11393
Simon Krajewski 1 жил өмнө
parent
commit
e0c7e93695

+ 12 - 6
src/optimization/analyzerTexprTransformer.ml

@@ -369,14 +369,14 @@ let rec func ctx bb tf t p =
 			bb
 		(* branching *)
 		| TMeta((Meta.MergeBlock,_,_),{eexpr = TBlock el}) ->
-			block_el bb el
+			block_el true bb el
 		| TBlock [] when (ExtType.is_void (follow e.etype)) ->
 			bb
 		| TBlock el ->
 			let bb_sub = create_node BKSub e.etype e.epos in
 			add_cfg_edge bb bb_sub CFGGoto;
 			close_node bb;
-			let bb_sub_next = block_el bb_sub el in
+			let bb_sub_next = block_el true bb_sub el in
 			if bb_sub_next != g.g_unreachable then begin
 				let bb_next = create_node BKNormal bb.bb_type bb.bb_pos in
 				set_syntax_edge bb (SESubBlock(bb_sub,bb_next));
@@ -619,12 +619,18 @@ let rec func ctx bb tf t p =
 			let bb = block_element bb e1 in
 			block_element bb e2
 		| TArrayDecl el ->
-			block_el bb el
+			block_el false bb el
 		| TObjectDecl fl ->
-			block_el bb (List.map snd fl)
+			block_el false bb (List.map snd fl)
 		| TFor _ | TWhile(_,_,DoWhile) ->
 			die "" __LOC__
-	and block_el bb el =
+	and block_el allow_void bb el =
+		let block_element = if allow_void then
+			block_element
+		else (fun bb e ->
+			no_void e.etype e.epos;
+			block_element bb e
+		) in
 		match !b_try_stack with
 		| [] ->
 			let rec loop bb el = match el with
@@ -656,7 +662,7 @@ let rec func ctx bb tf t p =
 			| TBlock el -> el
 			| _ -> [e]
 		in
-		block_el bb el
+		block_el true bb el
 	in
 	let bb_last = block bb_root tf.tf_expr in
 	close_node bb_last;