OSDN Git Service

PR fortran/34108
authorfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 17 Nov 2007 00:10:00 +0000 (00:10 +0000)
committerfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 17 Nov 2007 00:10:00 +0000 (00:10 +0000)
        * 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130249 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/io.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/fmt_label_1.f90 [new file with mode: 0644]

index a889682..0d343eb 100644 (file)
@@ -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
index 0e2a0cb..bb4295b 100644 (file)
@@ -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)
     {
index 2176152..bec1ea5 100644 (file)
@@ -1,3 +1,8 @@
+2007-11-17  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
+       PR fortran/34108
+       * gfortran.dg/fmt_label_1.f90: New test.
+
 2007-11-16  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
        PR fortran/33957
diff --git a/gcc/testsuite/gfortran.dg/fmt_label_1.f90 b/gcc/testsuite/gfortran.dg/fmt_label_1.f90
new file mode 100644 (file)
index 0000000..eb11b79
--- /dev/null
@@ -0,0 +1,8 @@
+! { dg-do compile }
+!
+! Check for diagnostics (PR 34108)
+  write (*,0) 'xxx' ! { dg-error "Statement label .* is zero" }
+  write (*,1) 'xxx' ! { dg-error "FORMAT label .* not defined" }
+  write (*,123456) 'xxx' ! { dg-error "Too many digits in statement label" }
+  write (*,-1) 'xxx' ! { dg-error "" }
+  end