diff options
author | Steven G. Kargl <kargl@gcc.gnu.org> | 2019-05-06 23:24:32 +0000 |
---|---|---|
committer | Steven G. Kargl <kargl@gcc.gnu.org> | 2019-05-06 23:24:32 +0000 |
commit | c21ffa3e53606d421c44f13fbd9e96a49b0cf833 (patch) | |
tree | d376cbb87c5845bec6297bee384dcd8e7bf0c39d /gcc/fortran/match.c | |
parent | b56be669f0aa79df4937c780306b77af538cd3a6 (diff) | |
download | gcc-c21ffa3e53606d421c44f13fbd9e96a49b0cf833.zip gcc-c21ffa3e53606d421c44f13fbd9e96a49b0cf833.tar.gz gcc-c21ffa3e53606d421c44f13fbd9e96a49b0cf833.tar.bz2 |
re PR fortran/90290 (-std=f2008 should reject non-constant stop and error stop codes)
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
Diffstat (limited to 'gcc/fortran/match.c')
-rw-r--r-- | gcc/fortran/match.c | 17 |
1 files changed, 14 insertions, 3 deletions
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", |