let range_of_assignable = function
| F.Aloc(te,loc) ->
let size = sizeof te in
begin
match loc with
| Model.Addr(b,d) -> model_range b d size
| Model.Ptr p -> model_range_of_ptr p size
end
| F.Arange(te,loc,rg) ->
begin
match rg with
|{F.inf=None;F.sup=Some h} ->
let size = n_size (F.i_add h F.i_one) te in
(match loc with
| Model.Addr(b,d) -> model_range b d size
| Model.Ptr p -> model_range_of_ptr p size
)
| {F.inf=Some l;F.sup=Some h} ->
let delta = n_size l te in
let size = n_size (cardinal l h) te in
(match loc with
| Model.Addr(b,d) ->
model_range b (F.i_add d delta) size
| Model.Ptr p ->
model_range_of_ptr (model_shift p delta) size
)
| _ -> unsupported "infinite range for array"
end