re PR fortran/89782 (Can do an internal READ of a character array when it is a parame...
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Sat, 22 Jun 2019 19:58:47 +0000 (19:58 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sat, 22 Jun 2019 19:58:47 +0000 (19:58 +0000)
2019-06-22  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR fortran/89782
* io.c (gfc_resolve_dt): Check that internal units are not
character PARAMETER.

* gfortran.dg/io_constraints.f90: New test.

From-SVN: r272594

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

index 42892276dbde813298ae8c632d21a69558ea987e..6489a047280dfd49f94e875dc433aa3f3be6fa38 100644 (file)
@@ -1,3 +1,9 @@
+2019-06-22  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/89782
+       * io.c (gfc_resolve_dt): Check that internal units are not
+       character PARAMETER.
+
 2019-06-21  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/67884
index 425c2b86899f791233b2f5bc5119b7c7172b2a50..cd21c6bcf82f1d779b16fb57c2a9e84896fc9bec 100644 (file)
@@ -3328,6 +3328,14 @@ gfc_resolve_dt (gfc_dt *dt, locus *loc)
       return false;
     }
 
+  if (e->symtree && e->symtree->n.sym->attr.flavor == FL_PARAMETER
+      && e->ts.type == BT_CHARACTER)
+    {
+      gfc_error ("UNIT specification at %L must "
+      "not be a character PARAMETER", &e->where);
+      return false;
+    }
+
   if (gfc_resolve_expr (e)
       && (e->ts.type != BT_INTEGER
          && (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_VARIABLE)))
index e4f4cf862851c18545f5d5dff8ccfd2bd1c95775..edd706420bab647930a75d78e76539a580be0832 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-22  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/89782
+       * gfortran.dg/io_constraints.f90: New test.
+
 2019-06-22  Iain Sandoe  <iain@sandoe.co.uk>
 
        * gcc.target/powerpc/pr64205.c: Require effective target dfp.
diff --git a/gcc/testsuite/gfortran.dg/io_constraints_14.f90 b/gcc/testsuite/gfortran.dg/io_constraints_14.f90
new file mode 100644 (file)
index 0000000..e5b62b1
--- /dev/null
@@ -0,0 +1,13 @@
+! { dg-do compile }
+program pr89782
+  character(len=*),parameter :: VALUES(*)=[character(len=10) :: 'NaN','NAN','nan','Inf','INF','inf','Infinity']
+  character(len=*),parameter :: VALUE='NaN'
+  real(4) :: var
+  do i=1,size(VALUES)
+    read(VALUES(i),*) float ! { dg-error "character PARAMETER" }
+    write(VALUES(i),*)float ! { dg-error "character PARAMETER" }
+  enddo
+  read(var,*)float    ! { dg-error "INTEGER expression or a CHARACTER" }
+  read(VALUE,*)float  ! { dg-error "character PARAMETER" }
+  write(VALUE,*)float ! { dg-error "character PARAMETER" }
+end program pr89782