Definition expr_closed_wrt_vars {CS: compspecs}(S: ident -> Prop) (e: expr) : Prop :=
forall rho te',
(forall i, S i \/ Map.get (te_of rho) i = Map.get te' i) ->
eval_expr e rho = eval_expr e (mkEnviron (ge_of rho) (ve_of rho) te').
Definition lvalue_closed_wrt_vars {CS: compspecs}(S: ident -> Prop) (e: expr) : Prop :=
forall rho te',
(forall i, S i \/ Map.get (te_of rho) i = Map.get te' i) ->
eval_lvalue e rho = eval_lvalue e (mkEnviron (ge_of rho) (ve_of rho) te').
(*moved to mpred Definition env_set (rho: environ) (x: ident) (v: val) : environ := mkEnviron (ge_of rho) (ve_of rho) (Map.set x v (te_of rho)).  Lemma eval_id_same: forall rho id v, eval_id id (env_set rho id v) = v. Hint Rewrite eval_id_same : normalize.  Lemma eval_id_other: forall rho id id' v, id<>id' -> eval_id id' (env_set rho id v) = eval_id id' rho. Hint Rewrite eval_id_other using solve [clear; intro Hx; inversion Hx] : normalize. *)
Definition typecheck_store e1 :=
(is_int_type (typeof e1) = true -> typeof e1 = Tint I32 Signed noattr) /\
(is_float_type (typeof e1) = true -> typeof e1 = Tfloat F64 noattr).
(*Typechecking facts to help semax_store go through until it gets generalized*)
Ltac tc_assert_ext :=
repeat match goal with
| [H : _ /\ _ |- _] => destruct H
end.
Ltac of_bool_destruct :=
match goal with
| [ |- context[Val.of_bool ?X] ] => destruct X
end.

(* Specifications: *)
Lemma orb_if : forall {D} b c (d:D) (e:D), (if (b || c) then d else e) = if b then d else if c then d else e.
intros.