Local Open Scope logic.
(*new*) Genv.find_symbol ge id = Some b -> (*new*) Genv.find_funct_ptr ge b = Some (External ef argsig retsig cc) -> semax_func V G ge fs G' -> semax_func V G ge ((id, External ef argsig retsig cc) :: fs) ((id, vacuous_funspec (External ef argsig retsig cc)) :: G').  Lemma int_eq_false_e: forall i j, Int.eq i j = false -> i <> j.   Lemma semax_ifthenelse_PQR' : forall Espec {cs: compspecs} (v: val) Delta P Q R (b: expr) c d Post, bool_type (typeof b) = true -> ENTAIL Delta, PROPx P (LOCALx Q (SEPx R)) |-- (tc_expr Delta (Eunop Cop.Onotbool b tint))  -> ENTAIL Delta, PROPx P (LOCALx Q (SEPx R)) |-- local (`(eq v) (eval_expr b)) -> @semax cs Espec Delta (PROPx (typed_true (typeof b) v :: P) (LOCALx Q (SEPx R))) c Post -> @semax cs Espec Delta (PROPx (typed_false (typeof b) v :: P) (LOCALx Q (SEPx R))) d Post -> @semax cs Espec Delta (PROPx P (LOCALx Q (SEPx R))) (Sifthenelse b c d) Post.  Definition logical_and_result v1 t1 v2 t2 := match (strict_bool_val t1 v1) with | Some b1 => if b1 then match (strict_bool_val t2 v2) with | Some b2 => if b2 then  Vint Int.one else Vint Int.zero | None => Vundef end else Vint Int.zero | None => Vundef end.  Definition logical_or_result v1 t1 v2 t2 := match (strict_bool_val t1 v1) with | Some b1 => if b1 then Vint Int.one else match (strict_bool_val t2 v2) with | Some b2 => if b2 then  Vint Int.one else Vint Int.zero | None => Vundef end | None => Vundef end.  (* NOTE: In both logical_or and logical_and, compcert (up to 2.4) has (Etempvar tid tbool) where I conjecture that it should have (Etempvar tid tint). That means our lemmas here are incompatible with compcert, at the moment. *)
Definition logical_and tid e1 e2 :=
(Sifthenelse e1
(Ssequence
(Sset tid (Ecast e2 tbool))
(Sset tid (Ecast (Etempvar tid tint (*tbool*)) tint)))
(Sset tid (Econst_int (Int.repr 0) tint))).

Lemma semax_while :
forall Espec {cs: compspecs} Delta Q test body (R: ret_assert),
bool_type (typeof test) = true ->
(local (tc_environ Delta) && Q |--  (tc_expr Delta (Eunop Cop.Onotbool test tint))) ->
(local (tc_environ Delta) && local (lift1 (typed_false (typeof test)) (eval_expr test)) && Q |-- RA_normal R) ->
@semax cs Espec Delta (local (`(typed_true (typeof test)) (eval_expr test)) && Q)  body (loop1_ret_assert Q R) ->
@semax cs Espec Delta Q (Swhile test body) R.