+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
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)
|| 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
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
/* 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;
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);
+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
--- /dev/null
+! { 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