Opaque sizeof.

(* Specifications: *)
Lemma data_at_singleton_array_eq {cs} sh t v (vl: list (reptype t)) p:
vl = [v] ->
@data_at cs sh (tarray t 1) vl p = @data_at cs sh t v p.
Lemma data_at_tuchar_singleton_array {cs} sh (v: val) p:
@data_at cs sh tuchar v p |-- @data_at cs sh (tarray tuchar 1) [v] p.
Lemma data_at_zero_array_inv {cs} sh t (v: list (reptype t)) p:
complete_legal_cosu_type t = true ->
v = (@nil (reptype t)) ->
@data_at cs sh (tarray t 0) v p |-- emp.
Lemma data_at_zero_array_eq {cs} sh t (v: list (reptype t)) p:
complete_legal_cosu_type t = true ->
isptr p ->
v = (@nil (reptype t)) ->
@data_at cs sh (tarray t 0) v p = emp.
Lemma data_at_tuchar_zero_array {cs} sh p: isptr p ->
emp |-- @data_at cs sh (tarray tuchar 0) [] p.
Lemma split2_data_at__Tarray_tuchar
: forall {cs} (sh : Share.t)  (n n1 : Z) (p : val),
0 <= n1 <= n -> isptr p ->field_compatible (Tarray tuchar n noattr) [] p ->
@data_at_ cs sh (Tarray tuchar n noattr) p =
@data_at_ cs sh (Tarray tuchar n1 noattr) p *
@data_at_ cs sh (Tarray tuchar (n - n1) noattr)
(field_address0 (Tarray tuchar n noattr) [ArraySubsc n1] p).
Lemma split2_data_at_Tarray_app:
forall {cs: compspecs} mid n (sh: Share.t) (t: type)
(v1 v2: list (reptype t)) p,
Zlength v1 = mid ->
Zlength v2 = n-mid ->
data_at sh (tarray t n) (v1 ++ v2) p =
data_at sh (tarray t mid) v1  p *
data_at sh (tarray t (n-mid)) v2
(field_address0 (tarray t n) [ArraySubsc mid] p).