Require Export VST.msl.msl_standard.
Require Export VST.veric.Memory. (*for address, and eq_dec memval*)
Instance EqDec_type: EqDec type := type_eq.
Definition funsig := (list (ident*type) * type)%type. (* argument and result signature *)
(*moved to mpred Definition strict_bool_val (v: val) (t: type) : option bool := match v, t with | Vint n, Tint _ _ _ => Some (negb (Int.eq n Int.zero)) | Vlong n, Tlong _ _ => Some (negb (Int64.eq n Int64.zero)) | (Vint n), (Tpointer _ _ | Tarray _ _ _ | Tfunction _ _ _ ) => if Int.eq n Int.zero then Some false else None | Vlong n, (Tpointer _ _ | Tarray _ _ _ | Tfunction _ _ _ ) => if Archi.ptr64 then if Int64.eq n Int64.zero then Some false else None else None | Vptr b ofs, (Tpointer _ _ | Tarray _ _ _ | Tfunction _ _ _ ) => Some true | Vfloat f, Tfloat F64 _ => Some (negb(Float.cmp Ceq f Float.zero)) | Vsingle f, Tfloat F32 _ => Some (negb(Float32.cmp Ceq f Float32.zero)) | _, _ => None end. *)
Inductive kind : Type := VAL : memval -> kind
| LK : forall n i : Z, kind
| FUN: funsig -> calling_convention -> kind.
(*Non-Ctypes.v- using variant: Inductive kind : Type := VAL : memval -> kind | LK : Z -> kind | CT: Z -> kind | FUN: (*funsig -> calling_convention*)signature -> kind. *)
Definition isVAL (k: kind) := match k with | VAL _ => True | _ => False end.
Definition isFUN (k: kind) := match k with | FUN _ _ => True | _ => False end.

Lemma isVAL_i: forall v, isVAL (VAL v).