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)