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)