Notation "'TYPE' A 'WITH'  x1 : t1 , x2 : t2 , x3 : t3 , x4 : t4 , x5 : t5 , x6 : t6 , x7 : t7 'PRE'  [ u , .. , v ] P 'POST' [ tz ] Q" :=
     (mk_funspec ((cons u%formals .. (cons v%formals nil) ..), tz) cc_default A
  (fun (ts: list Type) (x: t1*t2*t3*t4*t5*t6*t7) =>
     match x with (x1,x2,x3,x4,x5,x6,x7) => P%assert end)
  (fun (ts: list Type) (x: t1*t2*t3*t4*t5*t6*t7) =>
     match x with (x1,x2,x3,x4,x5,x6,x7) => Q%assert end) _ _)
            (at level 200, x1 at level 0, x2 at level 0, x3 at level 0, x4 at level 0,
             x5 at level 0, x6 at level 0, x7 at level 0,
             P at level 100, Q at level 100).Definition MA_spec v P (R : val -> mpred) Q := view_shift P (valid R v * (weak_precise_mpred (R v) && emp) * Q).Definition MA_type := ProdType (ProdType (ProdType (ConstType val) Mpred) (ArrowType (ConstType val) Mpred)) Mpred.Definition AL_spec P (R : val -> mpred) Q := forall vx, view_shift (valid R vx * P) (valid R vx * Q vx).Definition AL_type := ProdType (ProdType (ProdType (ConstType (share * val))
  Mpred) (ArrowType (ConstType val) Mpred)) (ArrowType (ConstType val) Mpred).Definition AS_spec v P (R : val -> mpred) Q := forall vx, view_shift (valid R vx * P)
  (valid R v * (weak_precise_mpred (R v) && emp) * Q).Definition AS_type := ProdType (ProdType (ProdType
  (ConstType (share * val * val)) Mpred) (ArrowType (ConstType val) Mpred)) Mpred.Definition ACAS_spec c v P (R Q : val -> mpred) := forall vx, view_shift (valid R vx * P)
  (valid R (if eq_dec c vx then v else vx) * (weak_precise_mpred (R (if eq_dec c vx then v else vx)) && emp) * Q vx).Definition ACAS_type := ProdType (ProdType (ProdType (ConstType (share * val * val * val)) Mpred)
  (ArrowType (ConstType val) Mpred)) (ArrowType (ConstType val) Mpred).

(* Specifications: *)
Lemma body_surely_malloc: semax_body Vprog Gprog f_surely_malloc surely_malloc_spec.
Lemma A_inv_positive : forall x l R, positive_mpred (A_inv x l R).
Lemma A_inv_precise : forall x l R, predicates_hered.derives TT (weak_precise_mpred (A_inv x l R)).
Lemma body_make_atomic : semax_body Vprog Gprog f_make_atomic make_atomic_spec.
Lemma body_free_atomic : semax_body Vprog Gprog f_free_atomic free_atomic_spec.
Lemma body_load_SC : semax_body Vprog Gprog f_load_SC load_SC_spec.
Lemma body_store_SC : semax_body Vprog Gprog f_store_SC store_SC_spec.
Lemma body_CAS_SC : semax_body Vprog Gprog f_CAS_SC CAS_SC_spec.
Lemma atomic_loc_precise : forall sh p R, readable_share sh -> precise (atomic_loc sh p R).
Lemma atomic_loc_join : forall sh1 sh2 sh p R (Hjoin : sepalg.join sh1 sh2 sh) (Hsh1 : readable_share sh1) (Hsh2 : readable_share sh2), atomic_loc sh1 p R * atomic_loc sh2 p R = atomic_loc sh p R.