Instance CompSpecs : compspecs.
(***** END *)
Definition do_or_spec :=
DECLARE _do_or
WITH a: int, b : int
PRE [ _a OF tbool, _b OF tbool ]
PROP () LOCAL (temp _a (Vint a); temp _b (Vint b)) SEP ()
POST [ tbool ]
PROP() LOCAL (temp ret_temp (Vint (logical_or_result a b)))
SEP().
Definition do_and_spec :=
DECLARE _do_and
WITH a: int, b : int
PRE [ _a OF tbool, _b OF tbool ]
PROP () LOCAL (temp _a (Vint a); temp _b (Vint b)) SEP ()
POST [ tbool ]
PROP() LOCAL (temp ret_temp (Vint (logical_and_result a b)))
SEP().
Definition main_spec :=
DECLARE _main
WITH gv: globals
PRE  [] main_pre prog nil gv
POST [ tint ] main_post prog nil gv.
Definition Vprog : varspecs := nil.
Definition Gprog : funspecs :=
ltac:(with_library prog [do_or_spec; do_and_spec; main_spec]).
Ltac do_semax_shortcut_logical :=
eapply semax_shortcut_logical;
[ reflexivity | reflexivity | prove_local2ptree
| reflexivity | reflexivity
| unfold fold_right; entailer  ].

(* Specifications: *)
Lemma body_do_or: semax_body Vprog Gprog f_do_or do_or_spec.
Lemma body_do_and: semax_body Vprog Gprog f_do_and do_and_spec.
Lemma body_main:  semax_body Vprog Gprog f_main main_spec.
Existing Instance NullExtension.Espec.
Lemma prog_correct:
semax_prog prog Vprog Gprog.