diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-11-17 00:10:00 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-11-17 00:10:00 +0000 |
commit | a48ebf39c9ff4310332dd9f2ea84f2992d7c9076 (patch) | |
tree | e39dc3e0dc7b62e6ca0d7390fcbbeac8a70a3e01 /gcc/fortran | |
parent | de03de6403a9d483644f3549071bdf3be9a1043b (diff) | |
download | gcc-a48ebf39c9ff4310332dd9f2ea84f2992d7c9076.zip gcc-a48ebf39c9ff4310332dd9f2ea84f2992d7c9076.tar.gz gcc-a48ebf39c9ff4310332dd9f2ea84f2992d7c9076.tar.bz2 |
re PR fortran/34108 (ICE: Segmentation fault occurs by "write(*,0)" statement)
PR fortran/34108
* io.c (check_format_string): Only check character expressions.
(match_dt_format): Return MATCH_ERROR if that is what
gfc_match_st_label said.
* gfortran.dg/fmt_label_1.f90: New test.
From-SVN: r130249
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/io.c | 8 |
2 files changed, 13 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index a889682..0d343eb 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2007-11-17 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> + + PR fortran/34108 + * io.c (check_format_string): Only check character expressions. + (match_dt_format): Return MATCH_ERROR if that is what + gfc_match_st_label said. + 2007-11-16 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> PR fortran/33957 diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index 0e2a0cb..bb4295b 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -919,7 +919,7 @@ finished: static try check_format_string (gfc_expr *e, bool is_input) { - if (!e || e->expr_type != EXPR_CONSTANT) + if (!e || e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT) return SUCCESS; mode = MODE_STRING; @@ -2082,6 +2082,7 @@ match_dt_format (gfc_dt *dt) locus where; gfc_expr *e; gfc_st_label *label; + match m; where = gfc_current_locus; @@ -2094,7 +2095,7 @@ match_dt_format (gfc_dt *dt) return MATCH_YES; } - if (gfc_match_st_label (&label) == MATCH_YES) + if ((m = gfc_match_st_label (&label)) == MATCH_YES) { if (dt->format_expr != NULL || dt->format_label != NULL) { @@ -2108,6 +2109,9 @@ match_dt_format (gfc_dt *dt) dt->format_label = label; return MATCH_YES; } + else if (m == MATCH_ERROR) + /* The label was zero or too large. Emit the correct diagnosis. */ + return MATCH_ERROR; if (gfc_match_expr (&e) == MATCH_YES) { |