re PR fortran/88269 (ICE in gfc_format_decoder, at fortran/error.c:947)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 10 Dec 2018 18:05:37 +0000 (18:05 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 10 Dec 2018 18:05:37 +0000 (18:05 +0000)
2018-12-10  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/88269
* io.c (io_constraint): Update macro. If locus line buffer is NULL,
use gfc_current_locus in error messages.
(check_io_constraints): Catch missing IO UNIT in write and read
statements.  io_constraint macro is incompatible here.

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

PR fortran/88269
* gfortran.dg/pr88269.f90: New test.

From-SVN: r266959

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

index 031a988e8c797034ccda266adf84b9b5cb322075..bbb8ce18d0e836144b4e78f561cc4fa052f36d15 100644 (file)
@@ -1,3 +1,11 @@
+2018-12-10  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/88269
+       * io.c (io_constraint): Update macro. If locus line buffer is NULL,
+       use gfc_current_locus in error messages.
+       (check_io_constraints): Catch missing IO UNIT in write and read
+       statements.  io_constraint macro is incompatible here.
+
 2018-12-09  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/88205
index 8008f92f38c2d2d06b9271c8db9b1dd6997e4e27..8d5410721ef3fea3ddbaa6204e2763185a031a56 100644 (file)
@@ -3678,10 +3678,13 @@ static match
 check_io_constraints (io_kind k, gfc_dt *dt, gfc_code *io_code,
                      locus *spec_end)
 {
-#define io_constraint(condition,msg,arg)\
+#define io_constraint(condition, msg, arg)\
 if (condition) \
   {\
-    gfc_error(msg,arg);\
+    if ((arg)->lb != NULL)\
+      gfc_error ((msg), (arg));\
+    else\
+      gfc_error ((msg), &gfc_current_locus);\
     m = MATCH_ERROR;\
   }
 
@@ -3741,11 +3744,14 @@ if (condition) \
   if (expr && expr->ts.type != BT_CHARACTER)
     {
 
-      io_constraint (gfc_pure (NULL) && (k == M_READ || k == M_WRITE),
-                    "IO UNIT in %s statement at %C must be "
+      if (gfc_pure (NULL) && (k == M_READ || k == M_WRITE))
+       {
+         gfc_error ("IO UNIT in %s statement at %C must be "
                     "an internal file in a PURE procedure",
                     io_kind_name (k));
-
+         return MATCH_ERROR;
+       }
+         
       if (k == M_READ || k == M_WRITE)
        gfc_unset_implicit_pure (NULL);
     }
index babcb6c2d2be747137a64cd9ae6b1a56104d741c..35b4fe14c2ecc3d92888e9dcfc421e4b49146496 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-10  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/88269
+       * gfortran.dg/pr88269.f90: New test.
+
 2018-12-10  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/88418
diff --git a/gcc/testsuite/gfortran.dg/pr88269.f90 b/gcc/testsuite/gfortran.dg/pr88269.f90
new file mode 100644 (file)
index 0000000..6cda5f7
--- /dev/null
@@ -0,0 +1,6 @@
+! { dg-do compile }
+! PR fortran/88269
+program p
+   write (end=1e1) ! { dg-error "tag not allowed" }
+end
+