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 <pa...@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 <pa...@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);