The attached patch fixes PR fortran/82049. Prior to this patch, gfortran was fouling up the resolution of the charlen expression in the testcase. The immediately tries to resolve the length while parsing the type-spec.
While here, I've introduced an optimization that causes gfc_match_type_spec() to return early if the gfortran isn't going to be getting a type-spec. This is done be peeking at the next character, if it is in [a-z], the we don't have a type spec. OK to commit? 2018-02-06 Steven G. Kargl <ka...@gcc.gnu.org> PR fortran/82049 * match.c (gfc_match_type_spec): If the charlen is non-NULL, then try to resolve it. While here return early if possible. 2018-02-06 Steven G. Kargl <ka...@gcc.gnu.org> PR fortran/82049 * gfortran.dg/assumed_charlen_parameter.f90: New test. -- Steve
Index: gcc/fortran/match.c =================================================================== --- gcc/fortran/match.c (revision 257391) +++ gcc/fortran/match.c (working copy) @@ -2054,11 +2054,17 @@ gfc_match_type_spec (gfc_typespec *ts) { match m; locus old_locus; - char name[GFC_MAX_SYMBOL_LEN + 1]; + char c, name[GFC_MAX_SYMBOL_LEN + 1]; gfc_clear_ts (ts); gfc_gobble_whitespace (); old_locus = gfc_current_locus; + + /* If c isn't [a-z], then return immediately. */ + c = gfc_peek_ascii_char (); + if (!ISALPHA(c)) + return MATCH_NO; + type_param_spec_list = NULL; if (match_derived_type_spec (ts) == MATCH_YES) @@ -2099,6 +2105,8 @@ gfc_match_type_spec (gfc_typespec *ts) ts->type = BT_CHARACTER; m = gfc_match_char_spec (ts); + if (ts->u.cl && ts->u.cl->length) + gfc_resolve_expr (ts->u.cl->length); if (m == MATCH_NO) m = MATCH_YES; Index: gcc/testsuite/gfortran.dg/assumed_charlen_parameter.f90 =================================================================== --- gcc/testsuite/gfortran.dg/assumed_charlen_parameter.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/assumed_charlen_parameter.f90 (working copy) @@ -0,0 +1,9 @@ +! { dg-do compile } +! PR fortran/82049 +! Original code contributed by John Harper <john dot harper at vuw dot ac dot nz> +program ice ! f2003 + implicit none + character(*), parameter:: a = 'ice', b = '*' + character(*), parameter:: c(2) = [character(len(a)) :: a, b] + print "(2A4)",adjustr(c) +end program ice