Fortran: Fix array copy-in/copy-out for BIND(C) functions [PR103390]
authorSandra Loosemore <sandra@codesourcery.com>
Mon, 3 Jan 2022 16:47:38 +0000 (08:47 -0800)
committerSandra Loosemore <sandra@codesourcery.com>
Mon, 3 Jan 2022 16:47:38 +0000 (08:47 -0800)
commit6447f6f983ffeaecb8753ef685d702bf2594968b
tree9594a3a4dd0b3474603be8838f7b6292ab6e6a23
parent6362627b27f395b054f359244fcfcb15ac0ac2ab
Fortran: Fix array copy-in/copy-out for BIND(C) functions [PR103390]

The Fortran front end was generating invalid code for the array
copy-out after a call to a BIND(C) function for a dummy with the
CONTIGUOUS attribute when the actual argument was a call to the SHAPE
intrinsic or other array expressions that are not lvalues.  It was
also generating code to evaluate the argument expression multiple
times on copy-in.  This patch teaches it to recognize that a copy is
not needed in these cases.

2022-01-03  Sandra Loosemore  <sandra@codesourcery.com>

PR fortran/103390

gcc/fortran/
* expr.c (gfc_is_simply_contiguous): Make it smarter about
function calls.
* trans-expr.c (gfc_conv_gfc_desc_to_cfi_desc): Do not generate
copy loops for array expressions that are not "variables" (lvalues).

gcc/testsuite/
* gfortran.dg/c-interop/pr103390-1.f90: New.
* gfortran.dg/c-interop/pr103390-2.f90: New.
* gfortran.dg/c-interop/pr103390-3.f90: New.
* gfortran.dg/c-interop/pr103390-4.f90: New.
* gfortran.dg/c-interop/pr103390-6.f90: New.
* gfortran.dg/c-interop/pr103390-7.f90: New.
* gfortran.dg/c-interop/pr103390-8.f90: New.
* gfortran.dg/c-interop/pr103390-9.f90: New.
gcc/fortran/expr.c
gcc/fortran/trans-expr.c
gcc/testsuite/gfortran.dg/c-interop/pr103390-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/c-interop/pr103390-2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/c-interop/pr103390-3.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/c-interop/pr103390-4.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/c-interop/pr103390-5.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/c-interop/pr103390-6.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/c-interop/pr103390-7.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/c-interop/pr103390-8.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/c-interop/pr103390-9.f90 [new file with mode: 0644]