diff options
author | Steven G. Kargl <kargl@gcc.gnu.org> | 2018-12-08 18:09:05 +0000 |
---|---|---|
committer | Steven G. Kargl <kargl@gcc.gnu.org> | 2018-12-08 18:09:05 +0000 |
commit | 4874b4d26c3ae78b69a51ab490bfba65d69e1323 (patch) | |
tree | 814a62bcd329a87fae9e3dad0f0e310a5bbba28b /gcc | |
parent | 47e1596cc1e877485483de1eca7b3eb4bd049cfb (diff) | |
download | gcc-4874b4d26c3ae78b69a51ab490bfba65d69e1323.zip gcc-4874b4d26c3ae78b69a51ab490bfba65d69e1323.tar.gz gcc-4874b4d26c3ae78b69a51ab490bfba65d69e1323.tar.bz2 |
re PR fortran/88357 (ICE in parse_associate, at fortran/parse.c:4568)
2018-12-08 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/88357
* class.c (insert_component_ref): Check for NULL pointer and
previous error message issued.
* parse.c (parse_associate): Check for NULL pointer.
* resolve.c (resolve_assoc_var): Check for NULL pointer.
2018-12-08 Steven G. Kargl <kargl@gcc.gnu.org>
* gfortran.dg/pr88357_1.f90: New test.
* gfortran.dg/pr88357_2.f90: New test.
From-SVN: r266908
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/class.c | 10 | ||||
-rw-r--r-- | gcc/fortran/parse.c | 2 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr88357_1.f90 | 9 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr88357_2.f90 | 8 |
7 files changed, 40 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9e17dec..8603e43 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2018-12-08 Steven G. Kargl <kargl@gcc.gnu.org> + + PR fortran/88357 + * class.c (insert_component_ref): Check for NULL pointer and + previous error message issued. + * parse.c (parse_associate): Check for NULL pointer. + * resolve.c (resolve_assoc_var): Check for NULL pointer. + 2018-12-07 Jakub Jelinek <jakub@redhat.com> PR fortran/88377 diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c index 2eae7f0..105511d 100644 --- a/gcc/fortran/class.c +++ b/gcc/fortran/class.c @@ -72,14 +72,18 @@ along with GCC; see the file COPYING3. If not see static void insert_component_ref (gfc_typespec *ts, gfc_ref **ref, const char * const name) { - gfc_symbol *type_sym; gfc_ref *new_ref; + int wcnt, ecnt; gcc_assert (ts->type == BT_DERIVED || ts->type == BT_CLASS); - type_sym = ts->u.derived; - gfc_find_component (type_sym, name, true, true, &new_ref); + gfc_find_component (ts->u.derived, name, true, true, &new_ref); + + gfc_get_errors (&wcnt, &ecnt); + if (ecnt > 0 && !new_ref) + return; gcc_assert (new_ref->u.c.component); + while (new_ref->next) new_ref = new_ref->next; new_ref->next = *ref; diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index 56d0d05..7acd8cf 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -4563,7 +4563,7 @@ parse_associate (void) else rank = a->target->rank; /* When the rank is greater than zero then sym will be an array. */ - if (sym->ts.type == BT_CLASS) + if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)) { if ((!CLASS_DATA (sym)->as && rank != 0) || (CLASS_DATA (sym)->as diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index b209021..35352c6 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -8715,7 +8715,8 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target) { /* target's rank is 0, but the type of the sym is still array valued, which has to be corrected. */ - if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as) + if (sym->ts.type == BT_CLASS + && CLASS_DATA (sym) && CLASS_DATA (sym)->as) { gfc_array_spec *as; symbol_attribute attr; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dc7c204..f4a7885 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-12-08 Steven G. Kargl <kargl@gcc.gnu.org> + + * gfortran.dg/pr88357_1.f90: New test. + * gfortran.dg/pr88357_2.f90: New test. + 2018-12-08 Jakub Jelinek <jakub@redhat.com> PR fortran/88304 diff --git a/gcc/testsuite/gfortran.dg/pr88357_1.f90 b/gcc/testsuite/gfortran.dg/pr88357_1.f90 new file mode 100644 index 0000000..5cda86e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr88357_1.f90 @@ -0,0 +1,9 @@ +! { dg-do compile } +! { dg-options "-fcoarray=single" } +program p + type t + end type + class(t) :: x[*] ! { dg-error "must be dummy, allocatable or pointer" } + associate (y => x) + end associate +end diff --git a/gcc/testsuite/gfortran.dg/pr88357_2.f90 b/gcc/testsuite/gfortran.dg/pr88357_2.f90 new file mode 100644 index 0000000..d89511b --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr88357_2.f90 @@ -0,0 +1,8 @@ +! { dg-do compile } +program p + type t + end type + class(t) :: x ! { dg-error "must be dummy, allocatable or pointer" } + associate (y => x) + end associate +end |