https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66461
--- Comment #16 from kargl at gcc dot gnu.org ---
(In reply to Jerry DeLisle from comment #10)
> This is a bandaid, but it works.
>
> diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
> index 2490f856..726973a6 100644
> --- a/gcc/fortran/match.c
> +++ b/gcc/fortran/match.c
> @@ -1438,7 +1438,16 @@ gfc_match_if (gfc_statement *if_type)
> if (m == MATCH_ERROR)
> return MATCH_ERROR;
>
> - gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match. */
> + m = gfc_match (" if ( %e ) ", &expr); /* Not always guaranteed to match.
> */
> +
> + if (m == MATCH_ERROR)
> + {
> + /* Under some invalid conditions like unexpected end of file, one
> + can get an error in the match. We bail out here and hope for
> + the best (the best being an error reported somewhere else. */
> + gfc_clear_error ();
> + return MATCH_YES;
> + }
>
> m = gfc_match_pointer_assignment ();
> if (m == MATCH_YES)
>
> Probably need to test some variations. I have dug around quite a bit in the
> scanner.c and other places trying to understand why this bug is only in
> fixed source. To no avail, and not sure its worth more time. I have even
> tried saving the know good locus and retoring just before the failing match
> attempt and it does not work.
I think your patch is almost correct. A better alternative would be
Index: match.c
===================================================================
--- match.c (revision 236243)
+++ match.c (working copy)
@@ -1560,7 +1560,22 @@ gfc_match_if (gfc_statement *if_type)
if (m == MATCH_ERROR)
return MATCH_ERROR;
- gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match. */
+ /* This should match, but mangled fixed-form Fortran code can return
+ an allocated, but otherwise uninitialized, expr. We check for
+ MATCH_NO or MATCH_ERROR, then queue an error and return. */
+ m = gfc_match (" if ( %e ) ", &expr);
+ if (gfc_current_form == FORM_FIXED && m != MATCH_YES)
+ {
+ if (expr && expr->expr_type == 0)
+ free (expr);
+ else
+ gfc_free_expr (expr);
+
+ gfc_undo_symbols ();
+ gfc_current_locus = old_loc;
+ gfc_error ("Mangled fixed-form Fortran near IF-statement at %C");
+ return MATCH_ERROR;
+ }
m = gfc_match_pointer_assignment ();
if (m == MATCH_YES)