re PR fortran/90290 (-std=f2008 should reject non-constant stop and error stop codes)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 6 May 2019 23:24:32 +0000 (23:24 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 6 May 2019 23:24:32 +0000 (23:24 +0000)
2019-05-06  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/90290
* match.c (gfc_match_stopcode): Check F2008 condition on stop code.

2019-05-06  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/90290
* gfortran.dg/pr90290.f90: New test.

From-SVN: r270928

gcc/fortran/ChangeLog
gcc/fortran/match.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr90290.f90 [new file with mode: 0644]

index 387bf1b4dda20ec3d97dc8dd74bbd07bdc784853..5aaa52eb302a787c2c52b45457f45f7c1a749710 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-06  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/90290
+       * match.c (gfc_match_stopcode): Check F2008 condition on stop code.
+
 2019-05-01  Andrew Benson  <abensonca@gmail.com>
 
        * module.c (write_module): Initialize module_column before writing
index 268217a4a5fe62a0897c04aeecf2787492fabd8e..69698e5ba2ecec701037fb7eb7425a37c656a5ba 100644 (file)
@@ -2977,7 +2977,7 @@ gfc_match_stopcode (gfc_statement st)
 {
   gfc_expr *e = NULL;
   match m;
-  bool f95, f03;
+  bool f95, f03, f08;
 
   /* Set f95 for -std=f95.  */
   f95 = (gfc_option.allow_std == GFC_STD_OPT_F95);
@@ -2985,6 +2985,9 @@ gfc_match_stopcode (gfc_statement st)
   /* Set f03 for -std=f2003.  */
   f03 = (gfc_option.allow_std == GFC_STD_OPT_F03);
 
+  /* Set f08 for -std=f2008.  */
+  f08 = (gfc_option.allow_std == GFC_STD_OPT_F08);
+
   /* Look for a blank between STOP and the stop-code for F2008 or later.  */
   if (gfc_current_form != FORM_FIXED && !(f95 || f03))
     {
@@ -3073,8 +3076,8 @@ gfc_match_stopcode (gfc_statement st)
       /* Test for F95 and F2003 style STOP stop-code.  */
       if (e->expr_type != EXPR_CONSTANT && (f95 || f03))
        {
-         gfc_error ("STOP code at %L must be a scalar CHARACTER constant or "
-                    "digit[digit[digit[digit[digit]]]]", &e->where);
+         gfc_error ("STOP code at %L must be a scalar CHARACTER constant "
+                    "or digit[digit[digit[digit[digit]]]]", &e->where);
          goto cleanup;
        }
 
@@ -3084,6 +3087,14 @@ gfc_match_stopcode (gfc_statement st)
       gfc_reduce_init_expr (e);
       gfc_init_expr_flag = false;
 
+      /* Test for F2008 style STOP stop-code.  */
+      if (e->expr_type != EXPR_CONSTANT && f08)
+       {
+         gfc_error ("STOP code at %L must be a scalar default CHARACTER or "
+                    "INTEGER constant expression", &e->where);
+         goto cleanup;
+       }
+
       if (!(e->ts.type == BT_CHARACTER || e->ts.type == BT_INTEGER))
        {
          gfc_error ("STOP code at %L must be either INTEGER or CHARACTER type",
index 51a17474cfb2c57e38afb388a7580927bd69dd90..662b419440b040493501403d4ccc0c69b44ba6e0 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-06  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/90290
+       * gfortran.dg/pr90290.f90: New test.
+
 2019-05-06  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/88709
diff --git a/gcc/testsuite/gfortran.dg/pr90290.f90 b/gcc/testsuite/gfortran.dg/pr90290.f90
new file mode 100644 (file)
index 0000000..280d7de
--- /dev/null
@@ -0,0 +1,7 @@
+! { dg-do compile }
+! { dg-options "-std=f2008" }
+program errorstop
+  integer :: ec
+  read *, ec
+  stop ec      ! { dg-error "STOP code at " }
+end program