aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <coudert@clipper.ens.fr>2005-12-03 16:32:04 +0100
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2005-12-03 15:32:04 +0000
commita34a91f0b73dad394cd0db44f5702406c09a06c6 (patch)
treefed5540ea5770fb73224878dea9cced4affb486c
parent1b2bb2edfa74093b2926ca0673e845edd7f5f8a5 (diff)
downloadgcc-a34a91f0b73dad394cd0db44f5702406c09a06c6.zip
gcc-a34a91f0b73dad394cd0db44f5702406c09a06c6.tar.gz
gcc-a34a91f0b73dad394cd0db44f5702406c09a06c6.tar.bz2
re PR fortran/25106 ([4.0/4.1] statement label is zero)
PR fortran/25106 * parse.c (next_free): Use new prototype for gfc_match_st_label. Correctly emit hard error if a label is zero. * match.c (gfc_match_st_label): Never allow zero as a valid label. (gfc_match, gfc_match_do, gfc_match_goto): Use new prototype for gfc_match_st_label. * primary.c (): Use new prototype for gfc_match_st_label. * io.c (): Likewise. * match.h: Likewise. From-SVN: r107999
-rw-r--r--gcc/fortran/ChangeLog13
-rw-r--r--gcc/fortran/io.c2
-rw-r--r--gcc/fortran/match.c19
-rw-r--r--gcc/fortran/match.h2
-rw-r--r--gcc/fortran/parse.c23
-rw-r--r--gcc/fortran/primary.c2
6 files changed, 36 insertions, 25 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f599bd6..00dcfdd 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,16 @@
+2005-12-30 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR fortran/25106
+ * parse.c (next_free): Use new prototype for gfc_match_st_label.
+ Correctly emit hard error if a label is zero.
+ * match.c (gfc_match_st_label): Never allow zero as a valid
+ label.
+ (gfc_match, gfc_match_do, gfc_match_goto): Use new prototype for
+ gfc_match_st_label.
+ * primary.c (): Use new prototype for gfc_match_st_label.
+ * io.c (): Likewise.
+ * match.h: Likewise.
+
2005-12-02 Richard Guenther <rguenther@suse.de>
* trans.h (build1_v): Use build1, not build to build the
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index 9ef97e8..6adc1ef 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -1591,7 +1591,7 @@ match_dt_format (gfc_dt * dt)
return MATCH_YES;
}
- if (gfc_match_st_label (&label, 0) == MATCH_YES)
+ if (gfc_match_st_label (&label) == MATCH_YES)
{
if (dt->format_expr != NULL || dt->format_label != NULL)
{
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index 97e8f5a..8ca7ed6 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -217,7 +217,7 @@ gfc_match_small_int (int *value)
do most of the work. */
match
-gfc_match_st_label (gfc_st_label ** label, int allow_zero)
+gfc_match_st_label (gfc_st_label ** label)
{
locus old_loc;
match m;
@@ -229,13 +229,16 @@ gfc_match_st_label (gfc_st_label ** label, int allow_zero)
if (m != MATCH_YES)
return m;
- if (((i == 0) && allow_zero) || i <= 99999)
+ if (i > 0 && i <= 99999)
{
*label = gfc_get_st_label (i);
return MATCH_YES;
}
- gfc_error ("Statement label at %C is out of range");
+ if (i == 0)
+ gfc_error ("Statement label at %C is zero");
+ else
+ gfc_error ("Statement label at %C is out of range");
gfc_current_locus = old_loc;
return MATCH_ERROR;
}
@@ -690,7 +693,7 @@ loop:
case 'l':
label = va_arg (argp, gfc_st_label **);
- n = gfc_match_st_label (label, 0);
+ n = gfc_match_st_label (label);
if (n != MATCH_YES)
{
m = n;
@@ -1242,7 +1245,7 @@ gfc_match_do (void)
if (gfc_match (" do") != MATCH_YES)
return MATCH_NO;
- m = gfc_match_st_label (&label, 0);
+ m = gfc_match_st_label (&label);
if (m == MATCH_ERROR)
goto cleanup;
@@ -1275,7 +1278,7 @@ gfc_match_do (void)
gfc_match_label (); /* This won't error */
gfc_match (" do "); /* This will work */
- gfc_match_st_label (&label, 0); /* Can't error out */
+ gfc_match_st_label (&label); /* Can't error out */
gfc_match_char (','); /* Optional comma */
m = gfc_match_iterator (&iter, 0);
@@ -1585,7 +1588,7 @@ gfc_match_goto (void)
do
{
- m = gfc_match_st_label (&label, 0);
+ m = gfc_match_st_label (&label);
if (m != MATCH_YES)
goto syntax;
@@ -1631,7 +1634,7 @@ gfc_match_goto (void)
do
{
- m = gfc_match_st_label (&label, 0);
+ m = gfc_match_st_label (&label);
if (m != MATCH_YES)
goto syntax;
diff --git a/gcc/fortran/match.h b/gcc/fortran/match.h
index a698102..a3c1d81 100644
--- a/gcc/fortran/match.h
+++ b/gcc/fortran/match.h
@@ -41,7 +41,7 @@ extern gfc_st_label *gfc_statement_label;
match gfc_match_space (void);
match gfc_match_eos (void);
match gfc_match_small_literal_int (int *);
-match gfc_match_st_label (gfc_st_label **, int);
+match gfc_match_st_label (gfc_st_label **);
match gfc_match_label (void);
match gfc_match_small_int (int *);
int gfc_match_strings (mstring *);
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c
index 0fc8f96..311d10a 100644
--- a/gcc/fortran/parse.c
+++ b/gcc/fortran/parse.c
@@ -318,30 +318,25 @@ next_free (void)
if (ISDIGIT (c))
{
/* Found a statement label? */
- m = gfc_match_st_label (&gfc_statement_label, 0);
+ m = gfc_match_st_label (&gfc_statement_label);
d = gfc_peek_char ();
if (m != MATCH_YES || !gfc_is_whitespace (d))
{
+ gfc_match_small_literal_int (&c);
+ if (c == 0)
+ gfc_error_now ("Statement label at %C is zero");
+ else
+ gfc_error_now ("Statement label at %C is out of range");
+
do
- {
- /* Skip the bad statement label. */
- gfc_warning_now ("Ignoring bad statement label at %C");
- c = gfc_next_char ();
- }
- while (ISDIGIT (c));
+ c = gfc_next_char ();
+ while (ISDIGIT(c));
}
else
{
label_locus = gfc_current_locus;
- if (gfc_statement_label->value == 0)
- {
- gfc_warning_now ("Ignoring statement label of zero at %C");
- gfc_free_st_label (gfc_statement_label);
- gfc_statement_label = NULL;
- }
-
gfc_gobble_whitespace ();
if (gfc_match_eos () == MATCH_YES)
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index d2b7068..234a803 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -1474,7 +1474,7 @@ gfc_match_actual_arglist (int sub_flag, gfc_actual_arglist ** argp)
if (sub_flag && gfc_match_char ('*') == MATCH_YES)
{
- m = gfc_match_st_label (&label, 0);
+ m = gfc_match_st_label (&label);
if (m == MATCH_NO)
gfc_error ("Expected alternate return label at %C");
if (m != MATCH_YES)