From 6b7a9826d737254eb70ab5a600ce5f334a7f922b Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Wed, 30 Oct 2019 20:01:36 +0000 Subject: [PATCH] Fortran] PR 92208 don't use function-result dummy variable as actual argument PR fortran/92208 * trans-array.c (gfc_conv_array_parameter): Only copy string-length backend_decl if expression is not a function. PR fortran/92208 * gfortran.dg/pr92208.f90: New. From-SVN: r277639 --- gcc/fortran/ChangeLog | 6 +++++ gcc/fortran/trans-array.c | 2 +- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gfortran.dg/pr92208.f90 | 39 +++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/pr92208.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0e8de4b2576..b86ea10a7e3 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2019-10-30 Tobias Burnus + + PR fortran/92208 + * trans-array.c (gfc_conv_array_parameter): Only copy + string-length backend_decl if expression is not a function. + 2019-10-30 Mark Eggleston * invoke.texi: Add -Wno-overwrite-recursive to list of options. Add diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 437892a6abf..2d85bf78c42 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -8049,7 +8049,7 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77, /* The components shall be deallocated before their containing entity. */ gfc_prepend_expr_to_block (&se->post, tmp); } - if (expr->ts.type == BT_CHARACTER) + if (expr->ts.type == BT_CHARACTER && expr->expr_type != EXPR_FUNCTION) se->string_length = expr->ts.u.cl->backend_decl; if (size) array_parameter_size (se->expr, expr, size); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ec613497bbc..c2d63003f9b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-10-30 Tobias Burnus + + PR fortran/92208 + * gfortran.dg/pr92208.f90: New. + 2019-10-30 Marek Polacek PR c++/92134 - constinit malfunction in static data member. diff --git a/gcc/testsuite/gfortran.dg/pr92208.f90 b/gcc/testsuite/gfortran.dg/pr92208.f90 new file mode 100644 index 00000000000..9de7f4b24b5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr92208.f90 @@ -0,0 +1,39 @@ +! { dg-do run } +! +! PR fortran/92208 +! +! Contributed by Nils Reiche +! +program stringtest + implicit none + integer, parameter :: noVars = 2 + +! print*, "varNames: ", createVarnames("var",noVars) + call function1(noVars,createVarnames("var",noVars),"path") + +contains + +function createVarnames(string,noVars) result(stringArray) + implicit none + character(len=*), intent(in) :: string + integer, intent(in) :: noVars + character(len=len_trim(string)+6), dimension(noVars) :: stringArray + integer :: i + do i=1,noVars + write(stringArray(i),'(a,i0)') string, i + enddo +end function createVarnames + +subroutine function1(noVars,varNames,path) + implicit none + integer, intent(in) :: noVars + character(len=*), intent(in) :: path + character(len=*), dimension(noVars) :: varNames + + if (path /= 'path') stop 1 + if (any(varNames /= ['var1', 'var2'])) stop 2 + !print*, "function1-path : ", trim(path) + !print*, "function1-varNames: ", varNames +end subroutine function1 + +end program stringtest -- 2.30.2