re PR fortran/64124 ([F95] Valid constant expr rejected)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Thu, 8 Mar 2018 00:42:41 +0000 (00:42 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Thu, 8 Mar 2018 00:42:41 +0000 (00:42 +0000)
2018-03-07  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/64124
PR fortran/70409
* decl.c (gfc_match_char_spec): Try to reduce a charlen to a constant.

2018-03-07  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/64124
PR fortran/70409
* gfortran.dg/pr64124.f90: New tests.
* gfortran.dg/pr70409.f90: New tests.

From-SVN: r258347

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr64124.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr70409.f90 [new file with mode: 0644]

index f87cce8..796b58d 100644 (file)
@@ -1,3 +1,9 @@
+2018-03-07  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/64124
+       PR fortran/70409
+       * decl.c (gfc_match_char_spec): Try to reduce a charlen to a constant.
+
 2017-03-06  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/84697
index dcfda27..1609643 100644 (file)
@@ -3147,7 +3147,24 @@ done:
   if (seen_length == 0)
     cl->length = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1);
   else
-    cl->length = len;
+    {
+      /* If gfortran ends up here, then the len may be reducible to a
+        constant.  Try to do that here.  If it does not reduce, simply
+        assign len to the charlen.  */
+      if (len && len->expr_type != EXPR_CONSTANT)
+       {
+         gfc_expr *e;
+         e = gfc_copy_expr (len);
+         gfc_reduce_init_expr (e);
+         if (e->expr_type == EXPR_CONSTANT)
+           gfc_replace_expr (len, e);
+         else
+           gfc_free_expr (e);
+         cl->length = len;
+       }
+      else
+       cl->length = len;
+    }
 
   ts->u.cl = cl;
   ts->kind = kind == 0 ? gfc_default_character_kind : kind;
index 080164d..d795f0d 100644 (file)
@@ -1,3 +1,10 @@
+2018-03-07  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/64124
+       PR fortran/70409
+       * gfortran.dg/pr64124.f90: New tests.
+       * gfortran.dg/pr70409.f90: New tests.
+
 2018-03-07  Segher Boessenkool  <segher@kernel.crashing.org>
 
        PR target/82411
diff --git a/gcc/testsuite/gfortran.dg/pr64124.f90 b/gcc/testsuite/gfortran.dg/pr64124.f90
new file mode 100644 (file)
index 0000000..349c20d
--- /dev/null
@@ -0,0 +1,5 @@
+! { dg-do compile }
+! PR fortran/64124.f90
+  character(len=kind(1)) x
+  integer(len(x)) y
+  end
diff --git a/gcc/testsuite/gfortran.dg/pr70409.f90 b/gcc/testsuite/gfortran.dg/pr70409.f90
new file mode 100644 (file)
index 0000000..0372f6e
--- /dev/null
@@ -0,0 +1,23 @@
+! { dg-do run }
+! PR fortran/70409
+! Contriubted by Harald Anlauf  <anlauf at gmx dot de>
+program foo
+  integer, parameter :: huge_1 = huge(0_1)
+  character(    huge_1      ), parameter :: x = 'abc'
+  character(    huge(0_1)   ), parameter :: y = 'abc'
+  character(    huge(0_1)+0 ), parameter :: z = 'abcdef'
+  character(    huge(0_1)   )            :: a = 'abc'
+  integer, parameter :: huge_2 = huge(0_2)
+  character(    huge_2      ), parameter :: u = 'abc'
+  character(    huge(0_2)   ), parameter :: v = 'abc'
+  character(int(huge(0_2),4)), parameter :: w = 'abcdef'
+  character(    huge(0_2)   )            :: b = 'abc'
+  if (len(x) /= huge_1) stop 1
+  if (len(y) /= huge_1) stop 2
+  if (len(z) /= huge_1) stop 3
+  if (len(a) /= huge_1) stop 4
+  if (len(u) /= huge_2) stop 5
+  if (len(v) /= huge_2) stop 6
+  if (len(w) /= huge_2) stop 7
+  if (len(b) /= huge_2) stop 8
+end program foo