[Bug fortran/88357] ICE in parse_associate, at fortran/parse.c:4568
kargl at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Dec 4 19:18:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88357
kargl at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |kargl at gcc dot gnu.org
--- Comment #3 from kargl at gcc dot gnu.org ---
(In reply to G. Steinmetz from comment #0)
> With invalid code, down to at least gcc-5 :
>
>
> $ cat z1.f90
> program p
> type t
> end type
> class(t) :: x[*]
> associate (y => x)
> end associate
> end
>
>
> $ gfortran-9-20181202 -c z1.f90 -fcoarray=single
> f951: internal compiler error: Segmentation fault
> 0xc8f33f crash_signal
> ../../gcc/toplev.c:326
> 0x69b4b9 parse_associate
> ../../gcc/fortran/parse.c:4568
Index: gcc/fortran/parse.c
===================================================================
--- gcc/fortran/parse.c (revision 266766)
+++ gcc/fortran/parse.c (working copy)
@@ -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
Index: gcc/fortran/class.c
===================================================================
--- gcc/fortran/class.c (revision 266766)
+++ gcc/fortran/class.c (working copy)
@@ -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;
More information about the Gcc-bugs
mailing list