This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Patch, fortran] PR58618 - Wrong code with character substring and ASSOCIATE
- From: Tobias Burnus <burnus at net-b dot de>
- To: Paul Richard Thomas <paul dot richard dot thomas at gmail dot com>, "fortran at gcc dot gnu dot org" <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 17 Oct 2018 23:17:29 +0200
- Subject: Re: [Patch, fortran] PR58618 - Wrong code with character substring and ASSOCIATE
- References: <CAGkQGi+Rq08DYLx8C2yXjUX8m2-3NUuMjtpExrbWdpb3anEF=w@mail.gmail.com>
Hi Paul,
Paul Richard Thomas wrote:
This problem concerned associate targets being substrings. It turns
out that they are returned as pointer types (with a different cast for
unity based substrings ***sigh***) and so can be assigned directly to
the associate name. The patch quite simply removed the condition that
such targets be allocatable, pointer or dummy.
I noticed in the course of working up the testcase that
character (:), pointer :: ptr => NULL()
character (6), target :: tgt = 'lmnopq'
ptr => tgt
print *, len (ptr), ptr
end
ICEs on the NULL initialization of the pointer but works fine if this
is removed. Has this already been posted as a PR?
I leave it to Dominique to search for a PR; otherwise, I believe the
attach patch fixes the issue. – It just needs someone to package it with
a test case, regtest and commit it.
Bootstrapped and regtested on FC28/x86_64 - OK for trunk?
OK – thanks for the fix.
Tobias
2018-10-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/58618
* trans-stmt.c (trans_associate_var): All strings that return
as pointer types can be assigned directly to the associate
name so remove 'attr' and the condition that uses it.
2018-10-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/58618
* gfortran.dg/associate_45.f90 : New test.
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index b0c12e5fc38..88f9f570725 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -1762,7 +1762,8 @@ gfc_get_symbol_decl (gfc_symbol * sym)
gfc_finish_var_decl (length, sym);
if (!sym->attr.associate_var
&& TREE_CODE (length) == VAR_DECL
- && sym->value && sym->value->ts.u.cl->length)
+ && sym->value && sym->value->expr_type != EXPR_NULL
+ && sym->value->ts.u.cl->length)
{
gfc_expr *len = sym->value->ts.u.cl->length;
DECL_INITIAL (length) = gfc_conv_initializer (len, &len->ts,
@@ -1772,7 +1773,7 @@ gfc_get_symbol_decl (gfc_symbol * sym)
DECL_INITIAL (length));
}
else
- gcc_assert (!sym->value);
+ gcc_assert (!sym->value || sym->value->expr_type == EXPR_NULL);
}
gfc_finish_var_decl (decl, sym);