aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2019-03-18 07:28:42 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2019-03-18 07:28:42 +0000
commit7e703f019b351ceb6c68da23bde1e1754746e1f2 (patch)
treeeafd6c6ec1a074bc9f6aa628548136aeb7378a6b
parentaf52cce0afdf36a6ae6472a9f9ed279341f2dc23 (diff)
downloadgcc-7e703f019b351ceb6c68da23bde1e1754746e1f2.zip
gcc-7e703f019b351ceb6c68da23bde1e1754746e1f2.tar.gz
gcc-7e703f019b351ceb6c68da23bde1e1754746e1f2.tar.bz2
re PR fortran/88008 (ICE in check_typebound_baseobject, at fortran/resolve.c:6058)
2019-03-17 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/88008 * gfortran.h (expr_t): Add EXPR_UNKNOWN. * expr.c (gfc_copy_expr): Add EXPR_UNKNOWN to switch statement. (gfc_simplify_expr): Likewise. * module.c (mio_expr): Likewise. * resovle.c (extract_compcall_passed_object): Issue error on unknown type. (check_typebound_baseobject): Issue error on wrong type. * trans-expr.c (gfc_apply_interface_mapping_to_expr): Add EXPR_UNKNOWN to switch statement. 2019-03-17 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/88008 * gfortran.dg/typebound_call_31.f90: New test. From-SVN: r269750
-rw-r--r--gcc/fortran/ChangeLog13
-rw-r--r--gcc/fortran/expr.c6
-rw-r--r--gcc/fortran/gfortran.h2
-rw-r--r--gcc/fortran/module.c1
-rw-r--r--gcc/fortran/resolve.c13
-rw-r--r--gcc/fortran/trans-expr.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/typebound_call_31.f9016
8 files changed, 55 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 762da70..8028118 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,16 @@
+2019-03-17 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/88008
+ * gfortran.h (expr_t): Add EXPR_UNKNOWN.
+ * expr.c (gfc_copy_expr): Add EXPR_UNKNOWN to switch statement.
+ (gfc_simplify_expr): Likewise.
+ * module.c (mio_expr): Likewise.
+ * resovle.c (extract_compcall_passed_object): Issue error on
+ unknown type.
+ (check_typebound_baseobject): Issue error on wrong type.
+ * trans-expr.c (gfc_apply_interface_mapping_to_expr): Add
+ EXPR_UNKNOWN to switch statement.
+
2019-03-16 Jakub Jelinek <jakub@redhat.com>
PR fortran/89724
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index d654f4e7..4c76f53 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -390,6 +390,9 @@ gfc_copy_expr (gfc_expr *p)
case EXPR_VARIABLE:
case EXPR_NULL:
break;
+
+ case EXPR_UNKNOWN:
+ gcc_unreachable ();
}
q->shape = gfc_copy_shape (p->shape, p->rank);
@@ -2206,6 +2209,9 @@ gfc_simplify_expr (gfc_expr *p, int type)
case EXPR_COMPCALL:
case EXPR_PPC:
break;
+
+ case EXPR_UNKNOWN:
+ gcc_unreachable ();
}
return true;
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index dd959e6..2f55b9c 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -142,7 +142,7 @@ enum gfc_source_form
/* Expression node types. */
enum expr_t
-{ EXPR_OP = 1, EXPR_FUNCTION, EXPR_CONSTANT, EXPR_VARIABLE,
+ { EXPR_UNKNOWN = 0, EXPR_OP = 1, EXPR_FUNCTION, EXPR_CONSTANT, EXPR_VARIABLE,
EXPR_SUBSTRING, EXPR_STRUCTURE, EXPR_ARRAY, EXPR_NULL, EXPR_COMPCALL, EXPR_PPC
};
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index 0572b8e..0c2699c 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -3694,6 +3694,7 @@ mio_expr (gfc_expr **ep)
case EXPR_COMPCALL:
case EXPR_PPC:
+ case EXPR_UNKNOWN:
gcc_unreachable ();
break;
}
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 62c7d37..7539aa7 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -5945,6 +5945,13 @@ extract_compcall_passed_object (gfc_expr* e)
{
gfc_expr* po;
+ if (e->expr_type == EXPR_UNKNOWN)
+ {
+ gfc_error ("Error in typebound call at %L",
+ &e->where);
+ return NULL;
+ }
+
gcc_assert (e->expr_type == EXPR_COMPCALL);
if (e->value.compcall.base_object)
@@ -6090,7 +6097,11 @@ check_typebound_baseobject (gfc_expr* e)
if (!base)
return false;
- gcc_assert (base->ts.type == BT_DERIVED || base->ts.type == BT_CLASS);
+ if (base->ts.type != BT_DERIVED && base->ts.type != BT_CLASS)
+ {
+ gfc_error ("Error in typebound call at %L", &e->where);
+ goto cleanup;
+ }
if (base->ts.type == BT_CLASS && !gfc_expr_attr (base).class_ok)
return false;
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 9575f39..3cd2ffa 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -4536,6 +4536,7 @@ gfc_apply_interface_mapping_to_expr (gfc_interface_mapping * mapping,
case EXPR_COMPCALL:
case EXPR_PPC:
+ case EXPR_UNKNOWN:
gcc_unreachable ();
break;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 131ef49..ecb9962 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-03-17 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/88008
+ * gfortran.dg/typebound_call_31.f90: New test.
+
2019-03-03-17 John David Anglin <danglin@gcc.gnu.org>
* gcc.dg/compat/pr83487-1_x.c: Use -fno-common option on hppa*-*-hpux*.
diff --git a/gcc/testsuite/gfortran.dg/typebound_call_31.f90 b/gcc/testsuite/gfortran.dg/typebound_call_31.f90
new file mode 100644
index 0000000..b33bbf1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/typebound_call_31.f90
@@ -0,0 +1,16 @@
+! { dg-do compile }
+! PR 88008 - this use to ICE. Original test case by
+! Gerhard Steinmetz.
+
+module m
+ type t
+ integer, pointer :: z
+ contains
+ procedure :: g
+ end type
+contains
+ subroutine g(x)
+ class(t) :: x
+ call x%z%g() ! { dg-error "Error in typebound call" }
+ end
+end