From 9d52e1bbd8382e3eca924ebefdcedda62bd0eeb5 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Tue, 19 Feb 2019 17:55:33 +0000 Subject: [PATCH] re PR fortran/89384 (CONTIGUOUS dummy argument in BIND(C) interface incorrect when actual is non-contiguous) 2019-02-19 Thomas Koenig PR fortran/89384 * trans-expr.c (gfc_conv_gfc_desc_to_cfi_desc): If the dummy argument is contiguous and the actual argument may not be, use gfc_conv_subref_array_arg. 2019-02-19 Thomas Koenig PR fortran/89384 * gfortran.dg/ISO_Fortran_binding_4.f90 From-SVN: r269024 --- gcc/fortran/ChangeLog | 7 +++++ gcc/fortran/trans-expr.c | 7 ++++- gcc/testsuite/ChangeLog | 5 ++++ .../gfortran.dg/ISO_Fortran_binding_4.f90 | 27 +++++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/ISO_Fortran_binding_4.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 989bf9aba74..ae06290ca8b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2019-02-19 Thomas Koenig + + PR fortran/89384 + * trans-expr.c (gfc_conv_gfc_desc_to_cfi_desc): If the dummy + argument is contiguous and the actual argument may not be, + use gfc_conv_subref_array_arg. + 2019-02-19 Chung-Lin Tang PR c/87924 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index a75f8a7c250..223fd14cd7b 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -4944,7 +4944,12 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym) if (e->rank != 0) { - gfc_conv_expr_descriptor (parmse, e); + if (fsym->attr.contiguous + && !gfc_is_simply_contiguous (e, false, true)) + gfc_conv_subref_array_arg (parmse, e, false, fsym->attr.intent, + fsym->attr.pointer); + else + gfc_conv_expr_descriptor (parmse, e); if (POINTER_TYPE_P (TREE_TYPE (parmse->expr))) parmse->expr = build_fold_indirect_ref_loc (input_location, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1c91cec1a81..4ea21550f0d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-02-19 Thomas Koenig + + PR fortran/89384 + * gfortran.dg/ISO_Fortran_binding_4.f90 + 2019-02-19 Thomas Schwinge PR c/87924 diff --git a/gcc/testsuite/gfortran.dg/ISO_Fortran_binding_4.f90 b/gcc/testsuite/gfortran.dg/ISO_Fortran_binding_4.f90 new file mode 100644 index 00000000000..2c6c81b2557 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/ISO_Fortran_binding_4.f90 @@ -0,0 +1,27 @@ +! { dg-do run } +! PR fortran/89384 - this used to give a wrong results +! with contiguous. +! Test case by Reinhold Bader. +module mod_ctg + implicit none +contains + subroutine ctg(x) BIND(C) + real, contiguous :: x(:) + + if (any(abs(x - [2.,4.,6.]) > 1.e-6)) then + write(*,*) 'FAIL' + else + write(*,*) 'OK' + end if + end subroutine +end module +program p + use mod_ctg + implicit none + real :: x(6) + integer :: i + + x = [ (real(i), i=1, size(x)) ] + call ctg(x(2::2)) + +end program -- 2.30.2