aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2021-02-21 21:44:24 +0100
committerHarald Anlauf <anlauf@gmx.de>2021-02-21 21:44:24 +0100
commit2df374b337a5f6cf5528e91718e4e12e4006b7ae (patch)
tree57a6a652114e28480eb07d33e6324c966d1dcad5 /gcc
parent3cc5f8620d3d72c51c79e456fc1c000b7d7e19a5 (diff)
downloadgcc-2df374b337a5f6cf5528e91718e4e12e4006b7ae.zip
gcc-2df374b337a5f6cf5528e91718e4e12e4006b7ae.tar.gz
gcc-2df374b337a5f6cf5528e91718e4e12e4006b7ae.tar.bz2
PR fortran/99169 - Do not clobber allocatable intent(out) dummy argument
gcc/fortran/ChangeLog: * trans-expr.c (gfc_conv_procedure_call): Do not add clobber to allocatable intent(out) argument. gcc/testsuite/ChangeLog: * gfortran.dg/intent_optimize_3.f90: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/trans-expr.c1
-rw-r--r--gcc/testsuite/gfortran.dg/intent_optimize_3.f9016
2 files changed, 17 insertions, 0 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 103cb31..e614924 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -6077,6 +6077,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
&& !fsym->attr.allocatable && !fsym->attr.pointer
&& !e->symtree->n.sym->attr.dimension
&& !e->symtree->n.sym->attr.pointer
+ && !e->symtree->n.sym->attr.allocatable
/* See PR 41453. */
&& !e->symtree->n.sym->attr.dummy
/* FIXME - PR 87395 and PR 41453 */
diff --git a/gcc/testsuite/gfortran.dg/intent_optimize_3.f90 b/gcc/testsuite/gfortran.dg/intent_optimize_3.f90
new file mode 100644
index 0000000..6ecd722
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/intent_optimize_3.f90
@@ -0,0 +1,16 @@
+! { dg-do run }
+! { dg-options "-O2" }
+! PR99169 - Segfault passing allocatable scalar into intent(out) dummy argument
+
+program p
+ implicit none
+ integer, allocatable :: i
+ allocate (i)
+ call set (i)
+ if (i /= 5) stop 1
+contains
+ subroutine set (i)
+ integer, intent(out) :: i
+ i = 5
+ end subroutine set
+end program p