let return env e wp =
on_context env "return" wp Keep_opened Keep_assigns
(fun env _assigns p ->
match e with
| None -> p
| Some e ->
begin
let mem = L.mem_at env Clabels.Here in
match expr mem e with
| Warning(source,reason) ->
Datalib.Collector.add_warning ~source ~reason
"Ignored returned value" ;
L.subst_result env None p
| Result v ->
let ty_to = L.result_type env 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)" ;
L.subst_result env None p
| Result v -> L.subst_result env (Some v) p
end
end)