Hint Resolve field_address_eq_offset' : prove_it_now.
Hint Rewrite <- @prop_and using solve [auto with typeclass_instances]: norm1.
Local Open Scope logic.

(* Specifications: *)
Lemma var_block_lvar2:
forall {cs: compspecs} {Espec: OracleKind} id t Delta P Q R Vs c Post,
(var_types Delta) ! id = Some t ->
complete_legal_cosu_type t = true ->
sizeof t < Ptrofs.modulus ->
is_aligned cenv_cs ha_env_cs la_env_cs t 0 = true ->
(forall v,
semax Delta ((PROPx P (LOCALx (lvar id t v :: Q) (SEPx (data_at_ Tsh t v :: R))))
* fold_right sepcon emp Vs)
c Post) ->
semax Delta ((PROPx P (LOCALx Q (SEPx R)))
* fold_right sepcon emp (var_block Tsh (id,t) :: Vs))
c Post.
Lemma var_block_lvar0
: forall {cs: compspecs} (id : positive) (t : type) (Delta : tycontext)  v rho,
(var_types Delta) ! id = Some t ->
complete_legal_cosu_type t = true ->
sizeof t < Ptrofs.modulus ->
is_aligned cenv_cs ha_env_cs la_env_cs t 0 = true ->
tc_environ Delta rho ->
locald_denote (lvar id t v) rho ->
data_at_ Tsh t v |-- var_block Tsh (id, t) rho.
Lemma postcondition_var_block:
forall {cs: compspecs} {Espec: OracleKind} Delta Pre c S1 S2 i t vbs,
(var_types  Delta) ! i = Some t ->
complete_legal_cosu_type t = true ->
sizeof t < Ptrofs.modulus ->
is_aligned cenv_cs ha_env_cs la_env_cs t 0 = true ->
semax Delta Pre c (frame_ret_assert S1
(S2 *  (EX  v : val, local (locald_denote (lvar i t v)) && `(data_at_ Tsh t v))
* fold_right sepcon emp vbs)) ->
semax Delta Pre c (frame_ret_assert S1
(S2 * fold_right sepcon emp (var_block Tsh (i,t) :: vbs))).