Fixpoint force_list {A} (al: list (option A)) : option (list A) :=
match al with
| Some a :: al' => match force_list al' with Some bl => Some (a::bl) | _ => None end
| nil => Some nil
| _ => None
end.

(* Specifications: *)
Lemma make_func_ptr:
forall id (Espec: OracleKind) (CS: compspecs) Delta P Q R fs gv p c Post,
(var_types Delta) ! id = None ->
(glob_specs Delta) ! id = Some fs ->
(glob_types Delta) ! id = Some (type_of_funspec fs) ->
snd (local2ptree Q) = Some gv /\ gv id = p ->
semax Delta (PROPx P (LOCALx Q (SEPx (func_ptr' fs p :: R)))) c Post ->
semax Delta (PROPx P (LOCALx Q (SEPx R))) c Post.