diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2019-10-30 20:01:36 +0000 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2019-10-30 21:01:36 +0100 |
commit | 6b7a9826d737254eb70ab5a600ce5f334a7f922b (patch) | |
tree | f36fd636c12258dbdebe9b7c154303f2dbaaf6ad | |
parent | c766762429d045b575853539e019746fde6ef076 (diff) | |
download | gcc-6b7a9826d737254eb70ab5a600ce5f334a7f922b.zip gcc-6b7a9826d737254eb70ab5a600ce5f334a7f922b.tar.gz gcc-6b7a9826d737254eb70ab5a600ce5f334a7f922b.tar.bz2 |
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
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-array.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr92208.f90 | 39 |
4 files changed, 51 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0e8de4b..b86ea10 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2019-10-30 Tobias Burnus <tobias@codesourcery.com> + + 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 <mark.eggleston@codethink.com> * 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 437892a..2d85bf7 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 ec61349..c2d6300 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-10-30 Tobias Burnus <tobias@codesourcery.com> + + PR fortran/92208 + * gfortran.dg/pr92208.f90: New. + 2019-10-30 Marek Polacek <polacek@redhat.com> 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 0000000..9de7f4b --- /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 |