Commit acb388a0 by Jerry DeLisle

re PR fortran/34325 (Wrong error message for syntax error)

2008-05-16  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

    PR fortran/34325
    * decl.c (match_attr_spec): Check for matching pairs of parenthesis.
    * expr.c (gfc_specification_expr): Supplement the error message with the
    type that was found.
    * resolve.c (gfc_resolve_index): Likewise.
    * match.c (gfc_match_parens): Clarify error message with "at or before".
    (gfc_match_do): Check for matching pairs of parenthesis.

From-SVN: r135428
parent d1325932
2008-05-16 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/34325
* decl.c (match_attr_spec): Check for matching pairs of parenthesis.
* expr.c (gfc_specification_expr): Supplement the error message with the
type that was found.
* resolve.c (gfc_resolve_index): Likewise.
* match.c (gfc_match_parens): Clarify error message with "at or before".
(gfc_match_do): Check for matching pairs of parenthesis.
2008-05-16 Tobias Burnus <burnus@net-b.de 2008-05-16 Tobias Burnus <burnus@net-b.de
* intrinsic.texi: Write Fortran 77/90/95 instead of F77/90/95; * intrinsic.texi: Write Fortran 77/90/95 instead of F77/90/95;
......
...@@ -2934,6 +2934,13 @@ match_attr_spec (void) ...@@ -2934,6 +2934,13 @@ match_attr_spec (void)
goto cleanup; goto cleanup;
} }
/* Check to make sure any parens are paired up correctly. */
if (gfc_match_parens () == MATCH_ERROR)
{
m = MATCH_ERROR;
goto cleanup;
}
seen[d]++; seen[d]++;
seen_at[d] = gfc_current_locus; seen_at[d] = gfc_current_locus;
......
...@@ -2573,7 +2573,8 @@ gfc_specification_expr (gfc_expr *e) ...@@ -2573,7 +2573,8 @@ gfc_specification_expr (gfc_expr *e)
if (e->ts.type != BT_INTEGER) if (e->ts.type != BT_INTEGER)
{ {
gfc_error ("Expression at %L must be of INTEGER type", &e->where); gfc_error ("Expression at %L must be of INTEGER type, found %s",
&e->where, gfc_basic_typename (e->ts.type));
return FAILURE; return FAILURE;
} }
......
...@@ -153,12 +153,12 @@ gfc_match_parens (void) ...@@ -153,12 +153,12 @@ gfc_match_parens (void)
if (count > 0) if (count > 0)
{ {
gfc_error ("Missing ')' in statement before %L", &where); gfc_error ("Missing ')' in statement at or before %L", &where);
return MATCH_ERROR; return MATCH_ERROR;
} }
if (count < 0) if (count < 0)
{ {
gfc_error ("Missing '(' in statement before %L", &where); gfc_error ("Missing '(' in statement at or before %L", &where);
return MATCH_ERROR; return MATCH_ERROR;
} }
...@@ -553,7 +553,6 @@ gfc_match_name (char *buffer) ...@@ -553,7 +553,6 @@ gfc_match_name (char *buffer)
return MATCH_ERROR; return MATCH_ERROR;
} }
buffer[i] = '\0'; buffer[i] = '\0';
gfc_current_locus = old_loc; gfc_current_locus = old_loc;
...@@ -1749,6 +1748,11 @@ gfc_match_do (void) ...@@ -1749,6 +1748,11 @@ gfc_match_do (void)
if (gfc_match_char (',') != MATCH_YES && gfc_match ("% ") != MATCH_YES) if (gfc_match_char (',') != MATCH_YES && gfc_match ("% ") != MATCH_YES)
return MATCH_NO; return MATCH_NO;
/* Check for balanced parens. */
if (gfc_match_parens () == MATCH_ERROR)
return MATCH_ERROR;
/* See if we have a DO WHILE. */ /* See if we have a DO WHILE. */
if (gfc_match (" while ( %e )%t", &iter.end) == MATCH_YES) if (gfc_match (" while ( %e )%t", &iter.end) == MATCH_YES)
{ {
......
...@@ -3510,8 +3510,8 @@ gfc_resolve_index (gfc_expr *index, int check_scalar) ...@@ -3510,8 +3510,8 @@ gfc_resolve_index (gfc_expr *index, int check_scalar)
if (index->ts.type != BT_INTEGER && index->ts.type != BT_REAL) if (index->ts.type != BT_INTEGER && index->ts.type != BT_REAL)
{ {
gfc_error ("Array index at %L must be of INTEGER type", gfc_error ("Array index at %L must be of INTEGER type, found %s",
&index->where); &index->where, gfc_basic_typename (index->ts.type));
return FAILURE; return FAILURE;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment