Definition value_fits: forall t, reptype t -> Prop :=
  type_func (fun t => reptype t -> Prop)
    (fun t v =>
       if type_is_volatile t then True else tc_val' t (repinject t v))
    (fun t n a P v => Zlength (unfold_reptype v) =  Z.max 0 n /\ Forall P (unfold_reptype v))
    (fun id a P v => struct_value_fits_aux (co_members (get_co id)) (co_members (get_co id)) P (unfold_reptype v))
    (fun id a P v => union_value_fits_aux (co_members (get_co id)) (co_members (get_co id)) P (unfold_reptype v)).

(* Specifications: *)
Lemma value_fits_eq: forall t v, value_fits t v = match t as t0 return (reptype t0 -> Prop) with | Tarray t' n a => fun v0 : reptype (Tarray t' n a) => (fun v1 : list (reptype t') => Zlength v1 = Z.max 0 n /\ Forall (value_fits t') v1) (unfold_reptype v0) | Tstruct i a => fun v0 : reptype (Tstruct i a) => struct_Prop (co_members (get_co i)) (fun it : ident * type => value_fits (field_type (fst it) (co_members (get_co i)))) (unfold_reptype v0) | Tunion i a => fun v0 : reptype (Tunion i a) => union_Prop (co_members (get_co i)) (fun it : ident * type => value_fits (field_type (fst it) (co_members (get_co i)))) (unfold_reptype v0) | t0 => fun v0: reptype t0 => (if type_is_volatile t0 then True else tc_val' t0 (repinject t0 v0)) end v.
Lemma value_fits_type_changable: forall (t1 t2: type) v1 v2, t1 = t2 -> JMeq v1 v2 -> value_fits t1 v1 = value_fits t2 v2.
Lemma default_value_fits: forall t, value_fits t (default_val t).
Lemma data_at_rec_share_join: forall sh1 sh2 sh t v b ofs, sepalg.join sh1 sh2 sh -> data_at_rec sh1 t v (Vptr b ofs) * data_at_rec sh2 t v (Vptr b ofs) = data_at_rec sh t v (Vptr b ofs).
Lemma nonreadable_memory_block_data_at_rec: forall sh t v b ofs (LEGAL_COSU: complete_legal_cosu_type t = true), 0 <= ofs /\ ofs + sizeof t < Ptrofs.modulus -> align_compatible_rec cenv_cs t ofs -> ~ readable_share sh -> value_fits t v -> memory_block sh (sizeof t) (Vptr b (Ptrofs.repr ofs)) = data_at_rec sh t v (Vptr b (Ptrofs.repr ofs)).
Lemma data_at_rec_change_composite {cs_from cs_to} {CCE: change_composite_env cs_from cs_to}: forall (sh: Share.t) (t: type) v1 v2, JMeq v1 v2 -> cs_preserve_type cs_from cs_to (coeq _ _) t = true -> @data_at_rec cs_from sh t v1 = @data_at_rec cs_to sh t v2.
Lemma value_fits_Tstruct: forall {cs: compspecs} t (v: reptype t) i a m v2 r, t = Tstruct i a -> m = co_members (get_co i) -> JMeq (@unfold_reptype cs t v) v2 -> r =struct_Prop m (fun it => value_fits (field_type (fst it) m)) v2 -> value_fits t v = r.
Lemma value_fits_Tunion: forall {cs: compspecs} t (v: reptype t) i a m v2 r, t = Tunion i a -> m = co_members (get_co i) -> JMeq (@unfold_reptype cs t v) v2 -> r =union_Prop m (fun it => value_fits (field_type (fst it) m)) v2 -> value_fits t v = r.
Lemma value_fits_by_value_defined: forall {cs: compspecs} t t' v r, type_is_by_value t = true -> repinject t v <> Vundef -> t = t' -> (r = if type_is_volatile t' then True else tc_val t' (repinject t v)) -> value_fits t v = r.
Lemma value_fits_by_value_Vundef: forall {cs: compspecs} t v, type_is_by_value t = true -> repinject t v = Vundef -> value_fits t v = True.
Lemma value_fits_by_value: forall {cs: compspecs} t t' v r, type_is_by_value t = true -> t = t' -> (r = if type_is_volatile t then True else tc_val' t' (repinject t v)) -> value_fits t v = r.
Lemma value_fits_Tarray: forall {cs: compspecs} t (v: reptype t) t' n a (v' : list (reptype t')) r, t = (Tarray t' n a) -> JMeq (unfold_reptype v) v' -> n >= 0 -> r = (Zlength v' = n /\ Forall (value_fits t') v') -> value_fits t v =r.