Inductive empty_type : Type := .
Definition withtype_of_NDfunspec fs := match fs with
mk_funspec _ _ (rmaps.ConstType A) _ _ _ _ => A | _ => empty_type end.
Definition withtype_of_funspec fs := match fs with
mk_funspec _ _ A _ _ _ _ => A end.

Lemma semax_call_NDsubsume :
forall (fs1: funspec) A P Q argsig retsig cc,
NDsubsume_funspec fs1
(NDmk_funspec  (argsig,retsig) cc A P Q)  ->
forall {CS: compspecs} {Espec: OracleKind},
forall  Delta  x (F: environ -> mpred) ret a bl,
Cop.classify_fun (typeof a) =
Cop.fun_case_f (type_of_params argsig) retsig cc ->
(retsig = Tvoid -> ret = None) ->
tc_fn_return Delta ret retsig ->
@semax CS Espec Delta
((|>((tc_expr Delta a) && (tc_exprlist Delta (snd (split argsig)) bl)))  &&
(`(func_ptr fs1) (eval_expr a) &&
|>(F * `(P x: environ -> mpred) (make_args' (argsig,retsig) (eval_exprlist (snd (split argsig)) bl)))))
(Scall ret a bl)
(normal_ret_assert
(EX old:val, substopt ret (`old) F * maybe_retval (Q x) retsig ret)).