Am 20.04.2013 12:42, schrieb Janus Weil:
Well, it does: As it doesn't know whether the array is contiguous or not - it packs the array. That's what one usually wants. However, for C_LOC one knows that the array is contiguous - the user promises this to the compiler - and, hence, no packing is needed.
Ok, I see. Then the patch is certainly ok. (The fact that
conv_isocbinding_function is used also for C_ASSOCIATED and C_FUNLOC
is no problem either, I guess).
Well, the code in question is under:

  if (expr->value.function.isym->id == GFC_ISYM_C_LOC)


However, if calling C_LOC on a non-contiguous array is invalid,
shouldn't one add a check for cases like
   integer, dimension(1:5,1:5), target :: zzz
   type(c_ptr) :: ptr
   ptr = c_loc (zzz(4:,4:))
where the compiler can easily tell that the argument is not contiguous ... ?

Definitely. I think there is also a PR about adding a gfc_is_simply_noncontiguous() or something like that. It has several uses: C_LOC, pointer-assignment to a contiguous pointer, removing some "if"s related to packing (as one knows that internal_pack will pack). And for compile-time simplification of the (unimplemented) Fortran 2008 function "is_contiguous".

Tobias

Reply via email to