aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2018-09-17 07:18:17 +0000
committerPaul Thomas <pault@gcc.gnu.org>2018-09-17 07:18:17 +0000
commitca32d61bab85b4df400d463ff891e4f833bad8ec (patch)
tree73ac3b0468f763ffe46fc2d04f7ca235be6b1f36
parent3cc2fdfd93efaf1b2e8bcffe84c20cbd1ffc4e96 (diff)
downloadgcc-ca32d61bab85b4df400d463ff891e4f833bad8ec.zip
gcc-ca32d61bab85b4df400d463ff891e4f833bad8ec.tar.gz
gcc-ca32d61bab85b4df400d463ff891e4f833bad8ec.tar.bz2
re PR fortran/85954 (ICE in make_ssa_name_fn, at tree-ssanames.c:266)
2018-09-17 Paul Thomas <pault@gcc.gnu.org> PR fortran/85954 * resolve.c (resolve_assoc_var): If the target expression is a deferred charlen dummy and the associate name shares the charlen, generate a new one. Make sure that new charlens are in the namespace list so that they get cleaned up. * trans-array.c (gfc_is_reallocatable_lhs): Associate names are not reallocatable. * trans-decl.c (gfc_get_symbol_decl): Put deferred character length dummy and result arrays on the deferred initialization list so that the variable length arrays can be correctly dealt with. * trans-expr.c (gfc_conv_string_length): Return if 'expr' is NULL rather than ICEing.. 2018-09-17 Paul Thomas <pault@gcc.gnu.org> PR fortran/85954 * gfortran.dg/deferred_character_21.f90 : New test. From-SVN: r264358
-rw-r--r--gcc/fortran/ChangeLog16
-rw-r--r--gcc/fortran/resolve.c10
-rw-r--r--gcc/fortran/trans-array.c3
-rw-r--r--gcc/fortran/trans-decl.c7
-rw-r--r--gcc/fortran/trans-expr.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/deferred_character_21.f9029
7 files changed, 71 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 4c6c244..22435d3 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,19 @@
+2018-09-17 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/85954
+ * resolve.c (resolve_assoc_var): If the target expression is a
+ deferred charlen dummy and the associate name shares the
+ charlen, generate a new one. Make sure that new charlens are in
+ the namespace list so that they get cleaned up.
+ * trans-array.c (gfc_is_reallocatable_lhs): Associate names are
+ not reallocatable.
+ * trans-decl.c (gfc_get_symbol_decl): Put deferred character
+ length dummy and result arrays on the deferred initialization
+ list so that the variable length arrays can be correctly dealt
+ with.
+ * trans-expr.c (gfc_conv_string_length): Return if 'expr' is
+ NULL rather than ICEing..
+
2018-09-16 Janus Weil <janus@gcc.gnu.org>
PR fortran/86484
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index ea0ce80..e6180b8 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -8744,6 +8744,14 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
if (!sym->ts.u.cl)
sym->ts.u.cl = target->ts.u.cl;
+ if (sym->ts.deferred && target->expr_type == EXPR_VARIABLE
+ && target->symtree->n.sym->attr.dummy
+ && sym->ts.u.cl == target->ts.u.cl)
+ {
+ sym->ts.u.cl = gfc_new_charlen (sym->ns, NULL);
+ sym->ts.deferred = 1;
+ }
+
if (!sym->ts.u.cl->length
&& !sym->ts.deferred
&& target->expr_type == EXPR_CONSTANT)
@@ -8756,7 +8764,7 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
|| sym->ts.u.cl->length->expr_type != EXPR_CONSTANT)
&& target->expr_type != EXPR_VARIABLE)
{
- sym->ts.u.cl = gfc_get_charlen();
+ sym->ts.u.cl = gfc_new_charlen (sym->ns, NULL);
sym->ts.deferred = 1;
/* This is reset in trans-stmt.c after the assignment
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 473bfc5..9565b7d 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -9520,6 +9520,9 @@ gfc_is_reallocatable_lhs (gfc_expr *expr)
sym = expr->symtree->n.sym;
+ if (sym->attr.associate_var)
+ return false;
+
/* An allocatable class variable with no reference. */
if (sym->ts.type == BT_CLASS
&& CLASS_DATA (sym)->attr.allocatable
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index eea6b81..e54d098 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -1510,6 +1510,13 @@ gfc_get_symbol_decl (gfc_symbol * sym)
/* Dummy variables should already have been created. */
gcc_assert (sym->backend_decl);
+ /* However, the string length of deferred arrays must be set. */
+ if (sym->ts.type == BT_CHARACTER
+ && sym->ts.deferred
+ && sym->attr.dimension
+ && sym->attr.allocatable)
+ gfc_defer_symbol_init (sym);
+
if (sym->attr.pointer && sym->attr.dimension && sym->ts.type != BT_CLASS)
GFC_DECL_PTR_ARRAY_P (sym->backend_decl) = 1;
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 2596b8e..35052a8 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -2237,7 +2237,8 @@ gfc_conv_string_length (gfc_charlen * cl, gfc_expr * expr, stmtblock_t * pblock)
if (!cl->length)
{
gfc_expr* expr_flat;
- gcc_assert (expr);
+ if (!expr)
+ return;
expr_flat = gfc_copy_expr (expr);
flatten_array_ctors_without_strlen (expr_flat);
gfc_resolve_expr (expr_flat);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 79ecbb7..c40fc5f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-09-17 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/85954
+ * gfortran.dg/deferred_character_21.f90 : New test.
+
2018-09-16 Janus Weil <janus@gcc.gnu.org>
PR fortran/86484
diff --git a/gcc/testsuite/gfortran.dg/deferred_character_21.f90 b/gcc/testsuite/gfortran.dg/deferred_character_21.f90
new file mode 100644
index 0000000..354c847
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/deferred_character_21.f90
@@ -0,0 +1,29 @@
+! { dg-do compile }
+! { dg-options "-O3" }
+!
+! Tests the fix for PR85954 in which the gimplifier could not determine
+! the space required for the dummy argument data types, when inlining the
+! subroutines.
+!
+! Contributed by G.Steinmetz <gscfq@t-online.de>
+!
+program p
+ character(kind=1,len=:), allocatable :: z(:)
+ allocate (z, source = ["xyz"])
+ print *, allocated(z), size(z), len(z), z
+ call s(z)
+ call t(z)
+contains
+ subroutine s(x)
+ character(kind=1,len=:), allocatable :: x(:)
+ x = ['abcd']
+ print *, allocated(x), size(x), len(x), x
+ end
+ subroutine t(x)
+ character(kind=1,len=:), allocatable :: x(:)
+ associate (y => x)
+ y = ['abc']
+ end associate
+ print *, allocated(x), size(x), len(x), x
+ end
+end