]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2010-05-22 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 23 May 2010 00:00:17 +0000 (00:00 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 23 May 2010 00:00:17 +0000 (00:00 +0000)
PR fortran/43851
* match.c (gfc_match_stopcode): Use gfc_match_init_expr. Go to cleanup
before returning MATCH_ERROR. Add check for scalar. Add check for
default integer kind.

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

gcc/fortran/ChangeLog
gcc/fortran/match.c

index abba8f50097bc016af107a929c1636159d581b2f..8f4656bba6c63be7036a14f768992a4493fde3a3 100644 (file)
@@ -1,3 +1,10 @@
+2010-05-22 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+       PR fortran/43851
+       * match.c (gfc_match_stopcode): Use gfc_match_init_expr. Go to cleanup
+       before returning MATCH_ERROR. Add check for scalar. Add check for
+       default integer kind.
+
 2010-05-22  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/44212
index a2ecb3a65f2378edfc472f3c7e4615fdd08b7ea6..a4900aa7eecb1762758761187b442826cfab394a 100644 (file)
@@ -2013,7 +2013,7 @@ gfc_match_stopcode (gfc_statement st)
 
   if (gfc_match_eos () != MATCH_YES)
     {
-      m = gfc_match_expr (&e);
+      m = gfc_match_init_expr (&e);
       if (m == MATCH_ERROR)
        goto cleanup;
       if (m == MATCH_NO)
@@ -2033,7 +2033,7 @@ gfc_match_stopcode (gfc_statement st)
   if (st == ST_STOP && gfc_find_state (COMP_CRITICAL) == SUCCESS)
     {
       gfc_error ("Image control statement STOP at %C in CRITICAL block");
-      return MATCH_ERROR;
+      goto cleanup;
     }
 
   if (e != NULL)
@@ -2042,7 +2042,14 @@ gfc_match_stopcode (gfc_statement st)
        {
          gfc_error ("STOP code at %L must be either INTEGER or CHARACTER type",
                     &e->where);
-         return MATCH_ERROR;
+         goto cleanup;
+       }
+
+      if (e->rank != 0)
+       {
+         gfc_error ("STOP code at %L must be scalar",
+                    &e->where);
+         goto cleanup;
        }
 
       if (e->ts.type == BT_CHARACTER
@@ -2050,14 +2057,15 @@ gfc_match_stopcode (gfc_statement st)
        {
          gfc_error ("STOP code at %L must be default character KIND=%d",
                     &e->where, (int) gfc_default_character_kind);
-         return MATCH_ERROR;
+         goto cleanup;
        }
 
-      if (e->expr_type != EXPR_CONSTANT)
+      if (e->ts.type == BT_INTEGER
+         && e->ts.kind != gfc_default_integer_kind)
        {
-         gfc_error ("STOP code at %L must be a constant expression",
-                    &e->where);
-         return MATCH_ERROR;
+         gfc_error ("STOP code at %L must be default integer KIND=%d",
+                    &e->where, (int) gfc_default_integer_kind);
+         goto cleanup;
        }
     }