http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50407
--- Comment #13 from Steve Kargl <sgk at troutmask dot apl.washington.edu> 2011-09-16 14:42:31 UTC --- On Fri, Sep 16, 2011 at 12:44:37PM +0000, sgk at troutmask dot apl.washington.edu wrote: > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50407 > > --- Comment #12 from Steve Kargl <sgk at troutmask dot apl.washington.edu> > 2011-09-16 12:44:37 UTC --- > On Fri, Sep 16, 2011 at 07:22:09AM +0000, zeccav at gmail dot com wrote: > > > > To me, it looks like the parser does not handle correctly the format > > specification as a default-char-expression defined in fortran 95 R913 > > > > I posted a patch yesterday. > Updated patch to deal with i = 42 print 1_'(i0)', i end Index: io.c =================================================================== --- io.c (revision 178782) +++ io.c (working copy) @@ -2548,17 +2554,31 @@ match_dt_format (gfc_dt *dt) if ((m = gfc_match_st_label (&label)) == MATCH_YES) { - if (dt->format_expr != NULL || dt->format_label != NULL) + char c; + + /* Need to check if the format label is actually either an operand + to a user-defined operator or is a kind type parameter. That is, + print 2.ip.8 ! .ip. is a user-defined operator return CHARACTER. + print 1_'(I0)', i ! 1_'(I0)' is a default character string. */ + + gfc_gobble_whitespace (); + c = gfc_peek_ascii_char (); + if (c == '.' || c == '_') + gfc_current_locus = where; + else { - gfc_free_st_label (label); - goto conflict; - } + if (dt->format_expr != NULL || dt->format_label != NULL) + { + gfc_free_st_label (label); + goto conflict; + } - if (gfc_reference_st_label (label, ST_LABEL_FORMAT) == FAILURE) - return MATCH_ERROR; + if (gfc_reference_st_label (label, ST_LABEL_FORMAT) == FAILURE) + return MATCH_ERROR; - dt->format_label = label; - return MATCH_YES; + dt->format_label = label; + return MATCH_YES; + } } else if (m == MATCH_ERROR) /* The label was zero or too large. Emit the correct diagnosis. */