From: Steven G. Kargl Date: Fri, 21 Jun 2019 00:54:28 +0000 (+0000) Subject: backport: re PR fortran/90290 (-std=f2008 should reject non-constant stop and error... X-Git-Tag: releases/gcc-9.2.0~215 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab7b24942d2903c73744108d38803d4950d3fb47;p=thirdparty%2Fgcc.git backport: re PR fortran/90290 (-std=f2008 should reject non-constant stop and error stop codes) 2019-06-20 Steven G. Kargl Backport from mainline PR fortran/90290 * match.c (gfc_match_stopcode): Check F2008 condition on stop code. 2019-06-20 Steven G. Kargl Backport from mainline PR fortran/90290 * gfortran.dg/pr90290.f90: New test. From-SVN: r272541 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 8fad5e8afb15..35d3091c0a6f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2019-06-20 Steven G. Kargl + + Backport from mainline + PR fortran/90290 + * match.c (gfc_match_stopcode): Check F2008 condition on stop code. + 2019-06-20 Steven G. Kargl Backport from mainline diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index bc780ce2e4a8..156d7a05f6b5 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -2955,7 +2955,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); @@ -2963,6 +2963,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)) { @@ -3051,8 +3054,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; } @@ -3062,6 +3065,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 fd0afe0828eb..7ad4fa2164eb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-06-20 Steven G. Kargl + + Backport from mainline + PR fortran/90290 + * gfortran.dg/pr90290.f90: New test. + 2019-06-20 Steven G. Kargl Backport from mainline diff --git a/gcc/testsuite/gfortran.dg/pr90290.f90 b/gcc/testsuite/gfortran.dg/pr90290.f90 new file mode 100644 index 000000000000..280d7ded0c3f --- /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