aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-11-17 00:10:00 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-11-17 00:10:00 +0000
commita48ebf39c9ff4310332dd9f2ea84f2992d7c9076 (patch)
treee39dc3e0dc7b62e6ca0d7390fcbbeac8a70a3e01 /gcc/fortran
parentde03de6403a9d483644f3549071bdf3be9a1043b (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/fortran/io.c8
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)
{