https://gcc.gnu.org/g:9d8888650e97cb76e4ea3b5d060e4a4cef38fc58
commit r15-2193-g9d8888650e97cb76e4ea3b5d060e4a4cef38fc58 Author: Andre Vehreschild <ve...@gcc.gnu.org> Date: Thu Jul 11 10:07:12 2024 +0200 Fix Rejects allocatable coarray passed as a dummy argument [88624] Coarray parameters of procedures/functions need to be dereffed, because they are references to the descriptor but the routine expected the descriptor directly. PR fortran/88624 gcc/fortran/ChangeLog: * trans-expr.cc (gfc_conv_procedure_call): Treat pointers/references (e.g. from parameters) correctly by derefing them. gcc/testsuite/ChangeLog: * gfortran.dg/coarray/dummy_1.f90: Add calling function trough function. * gfortran.dg/pr88624.f90: New test. Diff: --- gcc/fortran/trans-expr.cc | 35 +++++++++++++++++++-------- gcc/testsuite/gfortran.dg/coarray/dummy_1.f90 | 2 ++ gcc/testsuite/gfortran.dg/pr88624.f90 | 21 ++++++++++++++++ 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index d9eb333abcb1..feb43fdec746 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -7773,16 +7773,26 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, && CLASS_DATA (fsym)->attr.codimension && !CLASS_DATA (fsym)->attr.allocatable))) { - tree caf_decl, caf_type; + tree caf_decl, caf_type, caf_desc = NULL_TREE; tree offset, tmp2; caf_decl = gfc_get_tree_for_caf_expr (e); caf_type = TREE_TYPE (caf_decl); - - if (GFC_DESCRIPTOR_TYPE_P (caf_type) - && (GFC_TYPE_ARRAY_AKIND (caf_type) == GFC_ARRAY_ALLOCATABLE - || GFC_TYPE_ARRAY_AKIND (caf_type) == GFC_ARRAY_POINTER)) - tmp = gfc_conv_descriptor_token (caf_decl); + if (POINTER_TYPE_P (caf_type) + && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (caf_type))) + caf_desc = TREE_TYPE (caf_type); + else if (GFC_DESCRIPTOR_TYPE_P (caf_type)) + caf_desc = caf_type; + + if (caf_desc + && (GFC_TYPE_ARRAY_AKIND (caf_desc) == GFC_ARRAY_ALLOCATABLE + || GFC_TYPE_ARRAY_AKIND (caf_desc) == GFC_ARRAY_POINTER)) + { + tmp = POINTER_TYPE_P (TREE_TYPE (caf_decl)) + ? build_fold_indirect_ref (caf_decl) + : caf_decl; + tmp = gfc_conv_descriptor_token (tmp); + } else if (DECL_LANG_SPECIFIC (caf_decl) && GFC_DECL_TOKEN (caf_decl) != NULL_TREE) tmp = GFC_DECL_TOKEN (caf_decl); @@ -7795,8 +7805,8 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, vec_safe_push (stringargs, tmp); - if (GFC_DESCRIPTOR_TYPE_P (caf_type) - && GFC_TYPE_ARRAY_AKIND (caf_type) == GFC_ARRAY_ALLOCATABLE) + if (caf_desc + && GFC_TYPE_ARRAY_AKIND (caf_desc) == GFC_ARRAY_ALLOCATABLE) offset = build_int_cst (gfc_array_index_type, 0); else if (DECL_LANG_SPECIFIC (caf_decl) && GFC_DECL_CAF_OFFSET (caf_decl) != NULL_TREE) @@ -7806,8 +7816,13 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, else offset = build_int_cst (gfc_array_index_type, 0); - if (GFC_DESCRIPTOR_TYPE_P (caf_type)) - tmp = gfc_conv_descriptor_data_get (caf_decl); + if (caf_desc) + { + tmp = POINTER_TYPE_P (TREE_TYPE (caf_decl)) + ? build_fold_indirect_ref (caf_decl) + : caf_decl; + tmp = gfc_conv_descriptor_data_get (tmp); + } else { gcc_assert (POINTER_TYPE_P (caf_type)); diff --git a/gcc/testsuite/gfortran.dg/coarray/dummy_1.f90 b/gcc/testsuite/gfortran.dg/coarray/dummy_1.f90 index 33e95853ad4a..c437b2a10fc4 100644 --- a/gcc/testsuite/gfortran.dg/coarray/dummy_1.f90 +++ b/gcc/testsuite/gfortran.dg/coarray/dummy_1.f90 @@ -66,5 +66,7 @@ if (lcobound(A, dim=1) /= 2) STOP 13 if (ucobound(A, dim=1) /= 3) STOP 14 if (lcobound(A, dim=2) /= 5) STOP 15 + + call sub4(A) ! Check PR88624 is fixed. end subroutine sub5 end diff --git a/gcc/testsuite/gfortran.dg/pr88624.f90 b/gcc/testsuite/gfortran.dg/pr88624.f90 new file mode 100644 index 000000000000..e88ac907c6fc --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr88624.f90 @@ -0,0 +1,21 @@ +!{ dg-do compile } +!{ dg-options "-fcoarray=lib" } + +! Check that PR fortran/88624 is fixed. +! Contributed by Modrzejewski <m.modrzejew...@student.uw.edu.pl> +! Reduced to the essence of the issue. + +program test + implicit none + integer, dimension(:), allocatable :: x[:] + call g(x) +contains + subroutine g(x) + integer, dimension(:), allocatable :: x[:] + call g2(x) + end subroutine g + subroutine g2(x) + integer, dimension(:) :: x[*] + end subroutine g2 +end program test +