summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-12-08 14:37:49 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-12-08 14:37:49 +0100
commit47e1596cc1e877485483de1eca7b3eb4bd049cfb (patch)
tree20b3f0623f26e447a079ffd9681a686f56ac33d7 /gcc
parentdfe1fe91dbc7f068bb3efcee40237caacc0c53ae (diff)
re PR fortran/88304 (ICE in use_pointer_in_frame, at tree-nested.c:267)
PR fortran/88304 * tree-nested.c (convert_local_reference_stmt): Handle clobbers where lhs is not a decl normally, don't call use_pointer_in_frame on that lhs. * gfortran.fortran-torture/compile/pr88304-2.f90: New test. From-SVN: r266907
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.fortran-torture/compile/pr88304-2.f9028
-rw-r--r--gcc/tree-nested.c3
4 files changed, 42 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3da7dbe97e8..f97a51ef7ff 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2018-12-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/88304
+ * tree-nested.c (convert_local_reference_stmt): Handle clobbers where
+ lhs is not a decl normally, don't call use_pointer_in_frame on that
+ lhs.
+
2018-12-08 Eric Botcazou <ebotcazou@adacore.com>
PR rtl-optimization/88390
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index afa3d70534a..dc7c2041619 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-12-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/88304
+ * gfortran.fortran-torture/compile/pr88304-2.f90: New test.
+
2018-12-07 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/other/bitfield7.C: New.
diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/pr88304-2.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/pr88304-2.f90
new file mode 100644
index 00000000000..15bd451074d
--- /dev/null
+++ b/gcc/testsuite/gfortran.fortran-torture/compile/pr88304-2.f90
@@ -0,0 +1,28 @@
+! PR fortran/88304
+
+module pr88304
+ implicit none
+ integer :: p
+contains
+ function foo (x, y, z, w)
+ integer, intent(in) :: x, y
+ character(*), optional, intent(out) :: z
+ integer, optional, intent(out) :: w
+ integer :: foo
+ foo = 1
+ end function foo
+ subroutine bar ()
+ integer :: s
+ s = baz (1)
+ contains
+ function baz (u)
+ integer, intent(in) :: u
+ integer :: baz
+ integer :: q
+ integer :: r (10)
+ r = 0
+ baz = 1
+ q = foo (p, r(u), w = baz)
+ end function baz
+ end subroutine bar
+end module pr88304
diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c
index ea542466574..0ad469ada49 100644
--- a/gcc/tree-nested.c
+++ b/gcc/tree-nested.c
@@ -2324,7 +2324,8 @@ convert_local_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
if (gimple_clobber_p (stmt))
{
tree lhs = gimple_assign_lhs (stmt);
- if (!use_pointer_in_frame (lhs)
+ if (DECL_P (lhs)
+ && !use_pointer_in_frame (lhs)
&& lookup_field_for_decl (info, lhs, NO_INSERT))
{
gsi_replace (gsi, gimple_build_nop (), true);