From 4b424be470819ca32aa0e6301e10aef25587ed0f Mon Sep 17 00:00:00 2001 From: Michele Alberti <michele.alberti@cea.fr> Date: Mon, 9 Oct 2023 17:37:59 +0200 Subject: [PATCH] [oneret] Ensure to filter retvar out the function's body. --- src/kernel_internals/typing/oneret.ml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/kernel_internals/typing/oneret.ml b/src/kernel_internals/typing/oneret.ml index 80708cb6968..7c78d2dac0a 100644 --- a/src/kernel_internals/typing/oneret.ml +++ b/src/kernel_internals/typing/oneret.ml @@ -159,25 +159,27 @@ let encapsulate_local_vars f = in let retvar = match ret.skind with - | Return(None, _) -> [] - | Return(Some {enode = Lval (Var v,NoOffset)}, _) -> [v] + | Return(None, _) -> None + | Return(Some {enode = Lval (Var v,NoOffset)}, _) -> Some v | Return _ -> Kernel.fatal "Return node in unexpected format after oneret call" | _ -> Kernel.fatal "find_return did not return Return node" in - let ret_block_locals = - List.filter - (fun v -> - not (List.exists - (fun v' -> Cil_datatype.Varinfo.equal v v') retvar)) - ret_block.blocals + let filter_retvar_vi blocals = + Option.fold retvar + ~none:blocals + ~some:(fun retvar_vi -> + List.filter + (fun vi -> not (Cil_datatype.Varinfo.equal retvar_vi vi)) + blocals) in ret_block.bstmts <- ret_block_body; - ret_block.blocals <- ret_block_locals; + ret_block.blocals <- filter_retvar_vi ret_block.blocals; + f.sbody.blocals <- filter_retvar_vi f.sbody.blocals; let s1 = Cil.mkStmt (Block f.sbody) in let b = Cil.mkBlock [ s1; ret] in - b.blocals <- retvar; + b.blocals <- Option.to_list retvar; f.sbody <- b end -- GitLab