re PR fortran/88328 (ICE in resolve_tag_format, at fortran/io.c:1641)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Sun, 23 Dec 2018 05:18:27 +0000 (05:18 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Sun, 23 Dec 2018 05:18:27 +0000 (05:18 +0000)
2018-12-22  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/88328
* io.c (resolve_tag_format): Add error for zero-sized array.
(gfc_resolve_dt): Manipulate gfc_current_locus to get sensible error
message locus.

2018-12-22  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/88328
* gfortran.dg/pr88328.f90: New test.

From-SVN: r267367

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

index 276aad9c14b7a2c5df78decf4d0e4931b8c074db..d351d50790c8e944352b33a25069a61f8502de11 100644 (file)
@@ -1,3 +1,10 @@
+2018-12-22  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/88328
+       * io.c (resolve_tag_format): Add error for zero-sized array.
+       (gfc_resolve_dt): Manipulate gfc_current_locus to get sensible error
+       message locus.
+
 2018-12-22  Steven G . Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/85798
index 9c3e6892a07b0295d634c7cb3aed6173fc79ab52..541e6ef997e5cf6d87d3e7981a8c4ba210499e06 100644 (file)
@@ -1636,6 +1636,12 @@ resolve_tag_format (gfc_expr *e)
          gfc_expr *r;
          gfc_char_t *dest, *src;
 
+         if (e->value.constructor == NULL)
+          {
+            gfc_error ("FORMAT tag at %C cannot be a zero-sized array");
+            return false;
+          }
+
          n = 0;
          c = gfc_constructor_first (e->value.constructor);
          len = c->expr->value.character.length;
@@ -3245,12 +3251,21 @@ gfc_resolve_dt (gfc_dt *dt, locus *loc)
 {
   gfc_expr *e;
   io_kind k;
+  locus tmp;
 
   /* This is set in any case.  */
   gcc_assert (dt->dt_io_kind);
   k = dt->dt_io_kind->value.iokind;
 
-  RESOLVE_TAG (&tag_format, dt->format_expr);
+  tmp = gfc_current_locus;
+  gfc_current_locus = *loc;
+  if (!resolve_tag (&tag_format, dt->format_expr))
+    {
+      gfc_current_locus = tmp;
+      return false;
+    }
+  gfc_current_locus = tmp;
+
   RESOLVE_TAG (&tag_rec, dt->rec);
   RESOLVE_TAG (&tag_spos, dt->pos);
   RESOLVE_TAG (&tag_advance, dt->advance);
index 473d0c8bc964804dab8f67f461fa040991c9c2f1..806b141de78d8036a1b28898f92cab219fad59e4 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-22  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/88328
+       * gfortran.dg/pr88328.f90: New test.
+
 2018-12-21  Jan Hubicka  <jh@suse.cz>
 
        * g++.dg/ipa/devirt-30.C: Add dg-do.
diff --git a/gcc/testsuite/gfortran.dg/pr88328.f90 b/gcc/testsuite/gfortran.dg/pr88328.f90
new file mode 100644 (file)
index 0000000..cd1c6eb
--- /dev/null
@@ -0,0 +1,6 @@
+! { dg-do compile }
+! PR fortran/88328
+program p
+   character(3), parameter :: a(0) = [character(3)::]
+   print a ! { dg-error "zero-sized array" }
+end