[Bug fortran/92123] New: [F2018/array-descriptor] Scalar allocatable/pointer with array descriptor (via bind(C)): ICE with select rank or error scalar variable with POINTER or ALLOCATABLE in procedure with BIND(C) is not yet supported

burnus at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Oct 16 13:08:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92123

            Bug ID: 92123
           Summary: [F2018/array-descriptor]  Scalar allocatable/pointer
                    with array descriptor (via bind(C)): ICE with select
                    rank or error scalar variable with POINTER or
                    ALLOCATABLE in procedure with BIND(C) is not yet
                    supported
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Keywords: ice-on-valid-code, rejects-valid
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: burnus at gcc dot gnu.org
                CC: pault at gcc dot gnu.org
  Target Milestone: ---

Found on https://mailman.j3-fortran.org/pipermail/j3/2019-October/011669.html

The following shall use the array descriptor – and should work (TM):

  subroutine Fsub( dat ) bind(C, name="Fsub")
    integer(c_int), allocatable, intent(out) :: dat

Currently, it fails with:
  Error: Scalar variable ‘dat’ at (1) with POINTER or ALLOCATABLE in procedure
‘fsub’ with BIND(C) is not yet supported

Test program, see link to the J3 mailing list.


 * * * 

If one uses assumed-rank variables and adds 'select rank', it give an ICE. That
is with
    subroutine fsub( dat ) bind(C, name="fsub")
      integer(c_int), allocatable, intent(out) :: dat(..)    
      select rank (dat)
         rank (0)
         !dat = 42          !<-- A
         allocate( dat ) ; dat = 42      !<--- B
      end select 

It ICEs in gfc_conv_descriptor_data_get, at fortran/trans-array.c:145

 Breakpoint 3, trans_associate_var (sym=0x24d8ed0, block=0x7fffffffd5f0) at
../../repos/gcc/gcc/fortran/trans-stmt.c:1845
1845                  tmp = gfc_conv_descriptor_data_get (desc);

(gdb) p debug_tree(desc)
 <var_decl 0x7ffff7fc7ab0 __tmp_INTEGER_4_rank_0
    type <pointer_type 0x7ffff77429d8
        type <integer_type 0x7ffff773b5e8 integer(kind=4) public SI

which is a scalar without array descriptor.


More information about the Gcc-bugs mailing list