aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2019-10-30 20:01:36 +0000
committerTobias Burnus <burnus@gcc.gnu.org>2019-10-30 21:01:36 +0100
commit6b7a9826d737254eb70ab5a600ce5f334a7f922b (patch)
treef36fd636c12258dbdebe9b7c154303f2dbaaf6ad
parentc766762429d045b575853539e019746fde6ef076 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/fortran/trans-array.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr92208.f9039
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