https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93365
markeggleston at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|unassigned at gcc dot gnu.org |markeggleston at gcc dot gnu.org --- Comment #5 from markeggleston at gcc dot gnu.org --- (In reply to Steve Kargl from comment #4) > On Thu, Jan 23, 2020 at 03:37:04PM +0000, markeggleston at gcc dot gnu.org > wrote: > > > > If the parameter attribute is removed or a non zero sized array is used, the > > ICE does not occur. > > > > The ICE occurs in gfc_match_varspec (primary.c) a temporary gfc_ref > > structure > > has been created and has the type REF_INQUIRY. If the primary expression has > > been passed in is EXPR_CONSTANT the check is done. When the ICE occurs the > > type > > is EXPR_STRUCTURE, so the value of the REF_INQUIRY taken from u.i is used > > for > > the inquiry type instead of being 2 (INQUIRY_KIND) it is random > > e.g.73176720. > > > > Not quite, right. If you have > > complex, parameter :: a(1) = 0 > integer b > data b/a%kind% > > then at line 2337 in primary.c > > gfc_simplify_expr (primary, 0); > > collapses primary to an EXPR_CONSTANT, and then things seem to work. > > If you have > > complex, parameter :: a(0) = 0 > integer b > data b/a%kind% > > then "gfc_simplify_expr (primary, 0)" does not collapse primary > to EXPR_CONSTANT as it seems gfc_simplify_expr does not handle > zero size arrays (as there is nothing to simplify!). gfortran gfc_simplify_expr calls simplify_parameter_variable which for zero size arrays it creates a new gfc_expr structure with the expr_type set to EXPR_ARRAY and replaces primary. When primary is replaced its chain of ref structures is deleted so tmp->u.i is invalid causing the ICE the following lines are never reached: > then enters the switch statement and get to lines 2384-2385 > > primary->ts.type = BT_INTEGER; > primary->ts.kind = gfc_default_integer_kind; > > This just resets a part of primary, but it does not fix up > it up correctly. Likely, need to check for zero size > arrays do extra work. I have modified gfc_simplify_expr: --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -2069,8 +2069,13 @@ simplify_parameter_variable (gfc_expr *p, int type) e->value.constructor = NULL; e->shape = gfc_copy_shape (p->shape, p->rank); e->where = p->where; - gfc_replace_expr (p, e); - return true; + e->ref = gfc_copy_ref (p->ref); + t = gfc_simplify_expr (e, type); + if (t && !e->ref) + gfc_replace_expr (p, e); + else + gfc_free_expr (e); + return t; } e = gfc_copy_expr (p->symtree->n.sym->value); This results in primary being reduced to a EXPR_CONSTANT just like it is for non-zero length arrays. I've checked the 8 and 9 branches, 8 does not support this syntax and 9.2 behaves differently: program p real, parameter :: a(0) = 0.5 write(*,*) a%kind end compiles but the output is: 0.500000000 and program p real, parameter :: a(1) = 0.5 write(*,*) a%kind end fails to compile with an ICE. I'll investigate these further and ad either 1 or 2 new PRs. I'm now getting failures for several test cases in gfortran.dg, more work to do...