let return env e wp =
on_context env "return" wp Keep_opened Keep_assigns
(fun env _assigns p ->
let frame = L.get_frame env in
match e with
| None -> p
| Some e ->
begin
match expr (WpModel.mem_at frame Clabels.Here) e with
| Warning(source,reason) ->
Datalib.Collector.add_warning ~source ~reason
"Ignored returned value" ;
WpModel.subst_result frame None p
| Result v ->
let _,ty_to = WpModel.result frame in
let ty_from = Cil.typeOf e in
let r_cast = cast ty_to ty_from v in
begin
match r_cast with
| Warning(source,reason) ->
Datalib.Collector.add_warning ~source ~reason
"Ignored returned value (because of a cast)" ;
WpModel.subst_result frame None p
| Result v -> WpModel.subst_result frame (Some v) p
end
end)