Commit ca32d61b by Paul Thomas

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
parent 3cc2fdfd
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
......
......@@ -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
......
......@@ -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
......
......@@ -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;
......
......@@ -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);
......
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
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment