From: jvdelisle Date: Sun, 23 May 2010 00:00:17 +0000 (+0000) Subject: 2010-05-22 Jerry DeLisle X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=51de2e31dc0b9609310fe4816cafc9aefa563542;p=thirdparty%2Fgcc.git 2010-05-22 Jerry DeLisle 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 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index abba8f50097b..8f4656bba6c6 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2010-05-22 Jerry DeLisle + + 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 PR fortran/44212 diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index a2ecb3a65f23..a4900aa7eecb 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -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; } }