diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2019-03-18 07:28:42 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2019-03-18 07:28:42 +0000 |
commit | 7e703f019b351ceb6c68da23bde1e1754746e1f2 (patch) | |
tree | eafd6c6ec1a074bc9f6aa628548136aeb7378a6b | |
parent | af52cce0afdf36a6ae6472a9f9ed279341f2dc23 (diff) | |
download | gcc-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/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/fortran/expr.c | 6 | ||||
-rw-r--r-- | gcc/fortran/gfortran.h | 2 | ||||
-rw-r--r-- | gcc/fortran/module.c | 1 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 13 | ||||
-rw-r--r-- | gcc/fortran/trans-expr.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/typebound_call_31.f90 | 16 |
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 |