OSDN Git Service

PR fortran/25106
authorfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 3 Dec 2005 15:32:04 +0000 (15:32 +0000)
committerfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 3 Dec 2005 15:32:04 +0000 (15:32 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@107999 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/io.c
gcc/fortran/match.c
gcc/fortran/match.h
gcc/fortran/parse.c
gcc/fortran/primary.c

index f599bd6..00dcfdd 100644 (file)
@@ -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
index 9ef97e8..6adc1ef 100644 (file)
@@ -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)
        {
index 97e8f5a..8ca7ed6 100644 (file)
@@ -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;
 
index a698102..a3c1d81 100644 (file)
@@ -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 *);
index 0fc8f96..311d10a 100644 (file)
@@ -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)
index d2b7068..234a803 100644 (file)
@@ -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)