https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88328
kargl at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |kargl at gcc dot gnu.org --- Comment #2 from kargl at gcc dot gnu.org --- (In reply to kargl from comment #1) > (In reply to G. Steinmetz from comment #0) > > Affects versions down to at least gcc-5 : > > > > > > $ cat z1.f90 > > program p > > character(3), parameter :: a(0) = [character(3)::] > > print a > > end > > > > > > $ gfortran-9-20181202 -c z1.f90 > > f951: internal compiler error: Segmentation fault > > 0xb2ec9f crash_signal > > ../../gcc/toplev.c:326 > > 0x63ddee resolve_tag_format > > ../../gcc/fortran/io.c:1641 > > I get > > % gfcx -c a.f90 > a.f90:3:10: > > 3 | print a > | 1 > Error: FORMAT tag at (1) cannot be a zero-sized array > > with this patch > > Index: gcc/fortran/io.c > =================================================================== > --- gcc/fortran/io.c (revision 266710) > +++ gcc/fortran/io.c (working copy) > @@ -1636,6 +1636,12 @@ resolve_tag_format (gfc_expr *e) > gfc_expr *r; > gfc_char_t *dest, *src; > > + if (e->value.constructor == NULL) > + { > + gfc_error ("FORMAT tag at %C cannot be a zero-sized array"); > + return false; > + } > + > n = 0; > c = gfc_constructor_first (e->value.constructor); > len = c->expr->value.character.length; > @@ -3231,12 +3237,17 @@ gfc_resolve_dt (gfc_dt *dt, locus *loc) > { > gfc_expr *e; > io_kind k; > + locus loc_tmp; > > /* This is set in any case. */ > gcc_assert (dt->dt_io_kind); > k = dt->dt_io_kind->value.iokind; > > + loc_tmp = gfc_current_locus; > + gfc_current_locus = *loc; > RESOLVE_TAG (&tag_format, dt->format_expr); > + gfc_current_locus = loc_tmp; > + > RESOLVE_TAG (&tag_rec, dt->rec); > RESOLVE_TAG (&tag_spos, dt->pos); > RESOLVE_TAG (&tag_advance, dt->advance); The patch is slightly wrong. RESOLVE_TAG expands to 'if () return false', so on failure gfc_current_locus is not reset.