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

            Bug ID: 104100
           Summary: Passing an allocated array to a C bind function alters
                    the bounds
           Product: gcc
           Version: 11.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hzhou321 at anl dot gov
  Target Milestone: ---

https://github.com/pmodels/mpich/issues/4170#issuecomment-1015580478

Minimum reproducer:
`t.f90`:
```
program t
    INTERFACE
        SUBROUTINE F_cdesc(buf) bind(C, name="F_cdesc")
            IMPLICIT NONE
            TYPE(*), DIMENSION(..), INTENT(in) :: buf
        END SUBROUTINE
    END INTERFACE

    ! Only reproducible with allocatable array. "INTEGER:: A(5)" would be fine.
    INTEGER, allocatable, dimension(:):: A

    allocate(A(5))

    A = (/1, 2, 3, 4, 5/);
    print*, A
    write(*,'(a6,2(1x,i2))') 'Before:', lbound(A), ubound(A)

    ! "CALL F_cdesc(A)" would be fine
    CALL f08ts(A)

    print*, A
    write(*,'(a6,2(1x,i2))') 'After:', lbound(A), ubound(A)

    deallocate(A)

    contains
    SUBROUTINE f08ts(buf)
        IMPLICIT NONE
        TYPE(*), DIMENSION(..), INTENT(in) :: buf
        call F_cdesc(buf)
    END SUBROUTINE f08ts
end
```
`cdesc.c`:
```
#include <ISO_Fortran_binding.h>

void F_cdesc(CFI_cdesc_t *buf) { }
```
Run with:
```
gcc-9 -c -o cdesc.o cdesc.c && gfortran-9 t.f90 cdesc.o -o t && ./t
```

Results:
```
           1           2           3           4           5
Before  1  5
           1           2           3           4           5
After:  0  4
```

EDIT: also reproduced with `gcc 11`

Reply via email to