aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/match.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr90290.f907
4 files changed, 31 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 387bf1b..5aaa52e 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index 268217a4..69698e5 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -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",
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 51a1747..662b419 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..280d7de
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr90290.f90
@@ -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