Local Open Scope logic.
Require Export mc_reify.reify.
Require Export MirrorCore.RTac.Repeat.
Require Export MirrorCore.RTac.Try.
Require Export MirrorCore.RTac.First.
Require Export mc_reify.funcs.
Require Export mc_reify.reflexivity_tacs.
Definition set_lemma (temp : PTree.t (type * bool)) (var : PTree.t type)
(ret : type) (gt : PTree.t type) (id : ident)
(e : Clight.expr) (ty : type): my_lemma.
reify_lemma reify_vst (semax_set_localD temp var ret gt id e ty).
Defined.

Lemma semax_load_localD:
forall (temp : PTree.t (type * bool)) (var : PTree.t type)
(ret : type) (gt : PTree.t type) (id : ident) (t t_root : type) (e0 e1 : Clight.expr)
(efs : list efield) (tts : list type)
(e : type_id_env) (lr : LLRR) (n: nat)
(gs : PTree.t funspec) (sh : Share.t)
(P : list Prop) (T1 : PTree.t val) (T2 : PTree.t (type * val))
(R : list mpred) (Post : environ -> mpred)
(gfs : list gfield)
(p p' v : val) (v' : reptype t_root)
(Espec : OracleKind),
typeof_temp (mk_tycontext temp var ret gt gs) id = Some t ->
is_neutral_cast (typeof e0) t = true ->
msubst_efield_denote T1 T2 efs = Some gfs ->
legal_nested_efield e t_root e1 gfs tts lr = true ->
tc_efield_b_norho (mk_tycontext temp var ret gt gs) efs = true ->
msubst_eval_LR T1 T2 e1 lr = Some p ->
tc_LR_b_norho (mk_tycontext temp var ret gt gs) e1 lr = true ->
(@eq (option mpred)) (nth_error R n) (Some (data_at sh t_root v' p')) ->
(forall rho,
!!(tc_environ (mk_tycontext temp var ret gt gs) rho) && (assertD P (localD T1 T2) R rho) |-- !! (p = p')) ->
proj_val t_root gfs v' = v ->
assertD P (localD (PTree.set id v T1) T2) R = Post ->
nested_efield e1 efs tts = e0 ->
(forall rho,
!! (tc_environ (mk_tycontext temp var ret gt gs) rho) && (assertD P (localD T1 T2) R rho) |--
!! (tc_val (typeof e0) v) &&
!! (legal_nested_field t_root gfs)) ->
semax (mk_tycontext temp var ret gt gs) (|> assertD P (localD T1 T2) R)
(Sset id e0)
(normal_ret_assert Post).