aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/match.c
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2019-06-27 17:52:00 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2019-06-27 17:52:00 +0000
commitc2fe65930a4b48017042e49516eb338c9e241e53 (patch)
treeb33219a6ab48866b7456403126706057e7cab1e1 /gcc/fortran/match.c
parent76715c3216cf6ccd071fc852920af55d6b0054ae (diff)
downloadgcc-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.c28
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;