summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>2018-03-08 19:01:23 +0000
committerkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>2018-03-08 19:01:23 +0000
commit6f7db357134a32dea190f4a0b33485c09f304844 (patch)
tree8e5e5006db35861e72177c48dc44ff374abdce85
parent52891f5864a291f2eb8481806da13ef1cece6858 (diff)
downloadgcc-6f7db357134a32dea190f4a0b33485c09f304844.tar.gz
2018-03-08 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-08 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@258367 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/decl.c19
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/pr64124.f905
-rw-r--r--gcc/testsuite/gfortran.dg/pr70409.f9023
5 files changed, 59 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 55cf7d573ee..5e2a6cf3a7a 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2018-03-08 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-06 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/56667
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 6d3d28af127..e46b8394853 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -2979,7 +2979,24 @@ done:
if (seen_length == 0)
cl->length = gfc_get_int_expr (gfc_default_integer_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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index aafb8e1fc43..66fd20ceb61 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2018-03-08 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-06 Carl Love <cel@us.ibm.com>
Backport from mainline
diff --git a/gcc/testsuite/gfortran.dg/pr64124.f90 b/gcc/testsuite/gfortran.dg/pr64124.f90
new file mode 100644
index 00000000000..349c20de204
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr64124.f90
@@ -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
index 00000000000..0372f6e9632
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr70409.f90
@@ -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