From a34a91f0b73dad394cd0db44f5702406c09a06c6 Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Sat, 3 Dec 2005 16:32:04 +0100 Subject: 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 --- gcc/fortran/ChangeLog | 13 +++++++++++++ gcc/fortran/io.c | 2 +- gcc/fortran/match.c | 19 +++++++++++-------- gcc/fortran/match.h | 2 +- gcc/fortran/parse.c | 23 +++++++++-------------- gcc/fortran/primary.c | 2 +- 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 + + 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 * 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) -- cgit v1.1