Section CENV.
Context {cs: compspecs}.
Definition union_default_filter m :=
match m with
| nil => fun _ => false
| hd :: _ => fun m => if member_dec hd m then true else false
end.
Definition is_default_filter {A} f (l: list A) :=
match l with
| nil => True
| hd :: _ => f hd = true
end.
(* Lemma union_default_filter_legal: forall m, m <> nil -> legal_compact_sum_filter (union_default_filter m) m = true. *)
Definition struct_default_val (m : members) := compact_prod_gen (fun it => default_val (field_type (fst it) m)) m.
Definition union_default_val (m : members) := compact_sum_gen (fun it => true) (fun it => default_val (field_type (fst it) m)) m.

Lemma default_val_eq: forall t,
default_val t =
fold_reptype
match t as t' return REPTYPE t'
with
| Tvoid
| Tfunction _ _ _ => tt
| Tint _ _ _
| Tlong _ _
| Tfloat _ _
| Tpointer _ _ => Vundef
| Tarray t0 n _ => list_repeat (Z.to_nat n) (default_val t0)
| Tstruct id _ => struct_default_val (co_members (get_co id))
| Tunion id _ => union_default_val (co_members (get_co id))
end.