[J3] Allocatation upon assignment of a dummy argument in an interoperable procedure

Vipul Parekh parekhvs at gmail.com
Mon Oct 7 20:03:30 EDT 2019


Bill, Bob:

Re: "it is usually considered poor programming style to use the same
name for a dummy argument and the binding label for the routine,"
thanks, good point - chalk that up to another typo in my original
note; I was in a hurry to send out before I left for a long meeting -
the actual code didn't have that poor style!

Re: "It would be useful to see the C code that sets up the descriptor"
and Bob's questions, "How does it fail?   Was the C descriptor
initialized by CFI_establish and then passed changed to the
interoperable subroutine, or was the C descriptor changed after it was
established?," please see below.

Here's the code that works:

--- begin Fortran module ----
module m
   use, intrinsic :: iso_c_binding, only : c_int
contains
   subroutine Fsub( dat ) bind(C, name="Fsub")
      !.. Argument list
      integer(c_int), allocatable, intent(out) :: dat
      !dat = 42          !<-- A
      allocate( dat ) ; dat = 42      !<--- B
      return
   end subroutine
end module m
--- end Fortran module ---

and the C code:

--- begin C main ---
#include <stdlib.h>
#include <stdio.h>
#include "ISO_Fortran_binding.h"

// Prototype for Fortran functions
extern void Fsub(CFI_cdesc_t *);

int main()
{

   CFI_CDESC_T(0) dat;
   int irc = 0;

   irc = CFI_establish((CFI_cdesc_t *)&dat, NULL,
      CFI_attribute_allocatable,
      CFI_type_int, 0, (CFI_rank_t)0, NULL);
   if (irc == CFI_SUCCESS) {
      printf("CFI_establish succeeded for dat.\n");
   }
   else {
      printf("CFI_establish failed: irc = %d.\n", irc);
      return EXIT_FAILURE;
   }

   Fsub((CFI_cdesc_t *)&dat);
   printf("Fsub returned: %d\n", *(int *)dat.base_addr);

   irc = CFI_deallocate((CFI_cdesc_t *)&dat);
   if (irc == CFI_SUCCESS) {
      printf("CFI_deallocate for dat succeeded.\n");
   }
   else {
      printf("CFI_deallocate for dat failed: irc = %d.\n", irc);
      return EXIT_FAILURE;
   }

   return EXIT_SUCCESS;

}
--- end C main ---

Upon execution, the program output is:
CFI_establish succeeded for dat.
Fsub returned: 42
CFI_deallocate for dat succeeded.

Now if the line marked B (i.e., 'allocate( dat ) ; dat = 42') is
commented out and the one marked A is uncommented, the program prints
the first line "CFI_establish succeeded for dat" and the system then
issues a message the program "has stopped working."  The debugger
throws an exception at "dat = 42" line.  My hunch is this is a
compiler issue but first wanted to confirm whether the code conforms
to the standard.

Hope this helps,
Vipul


More information about the J3 mailing list