diff options
author | Steven G. Kargl <kargl@gcc.gnu.org> | 2019-06-27 17:52:00 +0000 |
---|---|---|
committer | Steven G. Kargl <kargl@gcc.gnu.org> | 2019-06-27 17:52:00 +0000 |
commit | c2fe65930a4b48017042e49516eb338c9e241e53 (patch) | |
tree | b33219a6ab48866b7456403126706057e7cab1e1 /gcc/fortran/match.c | |
parent | 76715c3216cf6ccd071fc852920af55d6b0054ae (diff) | |
download | gcc-c2fe65930a4b48017042e49516eb338c9e241e53.zip gcc-c2fe65930a4b48017042e49516eb338c9e241e53.tar.gz gcc-c2fe65930a4b48017042e49516eb338c9e241e53.tar.bz2 |
re PR fortran/90987 (Wrong error message with variables named "COMMON*")
2019-06-27 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/90987
* match.c (gfc_match_common): Adjust parsing of fixed and free form
source code containing, e.g., COMMONI.
2019-06-27 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/90987
* gfortran.dg/common_1.f: new test.
* gfortran.dg/common_26.f90: Ditto.
From-SVN: r272756
Diffstat (limited to 'gcc/fortran/match.c')
-rw-r--r-- | gcc/fortran/match.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index 1c08da7..0f3b213 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -5115,6 +5115,14 @@ gfc_match_common (void) gfc_array_spec *as; gfc_equiv *e1, *e2; match m; + char c; + + /* COMMON has been matched. In free form source code, the next character + needs to be whitespace or '/'. Check that here. Fixed form source + code needs to be checked below. */ + c = gfc_peek_ascii_char (); + if (gfc_current_form == FORM_FREE && !gfc_is_whitespace (c) && c != '/') + return MATCH_NO; as = NULL; @@ -5279,10 +5287,24 @@ gfc_match_common (void) gfc_gobble_whitespace (); if (gfc_match_eos () == MATCH_YES) goto done; - if (gfc_peek_ascii_char () == '/') + c = gfc_peek_ascii_char (); + if (c == '/') break; - if (gfc_match_char (',') != MATCH_YES) - goto syntax; + if (c != ',') + { + /* In Fixed form source code, gfortran can end up here for an + expression of the form COMMONI = RHS. This may not be an + error, so return MATCH_NO. */ + if (gfc_current_form == FORM_FIXED && c == '=') + { + gfc_free_array_spec (as); + return MATCH_NO; + } + goto syntax; + } + else + gfc_match_char (','); + gfc_gobble_whitespace (); if (gfc_peek_ascii_char () == '/') break; |