Browse Source

[analyzer] check Void for _all_ values

oh dear
Simon Krajewski 9 years ago
parent
commit
99d76ec497
1 changed files with 5 additions and 3 deletions
  1. 5 3
      src/optimization/analyzerTexprTransformer.ml

+ 5 - 3
src/optimization/analyzerTexprTransformer.ml

@@ -85,7 +85,7 @@ let rec func ctx bb tf t p =
 	let no_void t p =
 	let no_void t p =
 		if ExtType.is_void (follow t) then error "Cannot use Void as value" p
 		if ExtType.is_void (follow t) then error "Cannot use Void as value" p
 	in
 	in
-	let rec value bb e = match e.eexpr with
+	let rec value' bb e = match e.eexpr with
 		| TLocal v ->
 		| TLocal v ->
 			bb,e
 			bb,e
 		| TBinop(OpAssign,({eexpr = TLocal v} as e1),e2) ->
 		| TBinop(OpAssign,({eexpr = TLocal v} as e1),e2) ->
@@ -168,6 +168,10 @@ let rec func ctx bb tf t p =
 			bb,mk (TConst TNull) t_dynamic e.epos
 			bb,mk (TConst TNull) t_dynamic e.epos
 		| TVar _ | TFor _ | TWhile _ ->
 		| TVar _ | TFor _ | TWhile _ ->
 			error "Cannot use this expression as value" e.epos
 			error "Cannot use this expression as value" e.epos
+	and value bb e =
+		let bb,e = value' bb e in
+		no_void e.etype e.epos;
+		bb,e
 	and ordered_value_list bb el =
 	and ordered_value_list bb el =
 		let might_be_affected,collect_modified_locals = Optimizer.create_affection_checker() in
 		let might_be_affected,collect_modified_locals = Optimizer.create_affection_checker() in
 		let rec can_be_optimized e = match e.eexpr with
 		let rec can_be_optimized e = match e.eexpr with
@@ -479,7 +483,6 @@ let rec func ctx bb tf t p =
 		| TThrow e1 ->
 		| TThrow e1 ->
 			begin try
 			begin try
 				let mk_throw e1 =
 				let mk_throw e1 =
-					no_void e1.etype e1.epos;
 					mk (TThrow e1) t_dynamic e.epos
 					mk (TThrow e1) t_dynamic e.epos
 				in
 				in
 				block_element_value bb e1 mk_throw
 				block_element_value bb e1 mk_throw
@@ -489,7 +492,6 @@ let rec func ctx bb tf t p =
 					| [] -> add_cfg_edge bb bb_exit CFGGoto
 					| [] -> add_cfg_edge bb bb_exit CFGGoto
 					| _ -> List.iter (fun bb_exc -> add_cfg_edge bb bb_exc CFGGoto) !b_try_stack;
 					| _ -> List.iter (fun bb_exc -> add_cfg_edge bb bb_exc CFGGoto) !b_try_stack;
 				end;
 				end;
-				no_void e1.etype e1.epos;
 				add_terminator bb {e with eexpr = TThrow e1};
 				add_terminator bb {e with eexpr = TThrow e1};
 			end
 			end
 		(* side_effects *)
 		(* side_effects *)