This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch, fortran] PR58618 - Wrong code with character substring and ASSOCIATE


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);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]