https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108434

anlauf at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|anlauf at gcc dot gnu.org          |unassigned at gcc dot 
gnu.org
             Status|ASSIGNED                    |NEW

--- Comment #11 from anlauf at gcc dot gnu.org ---
(In reply to Paul Thomas from comment #10)
> Created attachment 59454 [details]
> Potential fix for comment 1

Hi Paul,

this is an interesting attempt!  It fixes the testcases here, but ICEs when
adding the following obvious declaration

> program p
>    type c
>       integer :: i
>    end type
>    type t
>       class(c), allocatable :: a(2)
>    end type
>    type s
>       class(d), allocatable :: a(2)
>    end type

   type u
      type(e),  allocatable :: b(2)
   end type

>    class(t), pointer :: y1
>    class(t), allocatable :: x1
>    class(s), pointer :: y2
>    class(s), allocatable :: x2
> end

> I am not sure that the chunk in resolve.cc is needed any more but it doesn't
> do any harm!

I also do not see that it is needed nor doing any harm, but why don't you
protect the line before the for loop?

diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 565d4aa5fe9..0db6f0b2f1e 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -14599,7 +14599,7 @@ gfc_resolve_finalizers (gfc_symbol* derived, bool
*finalizable)

   /* Ensure that derived-type components have a their finalizers resolved.  */
   bool has_final = derived->f2k_derived && derived->f2k_derived->finalizers;
-  for (c = derived->components; c; c = c->next)
+  for (c = derived ? derived->components : NULL; c; c = c->next)
     if (c->ts.type == BT_DERIVED
        && !c->attr.pointer && !c->attr.proc_pointer && !c->attr.allocatable)
       {

If we were to get here with derived == NULL, one could use:

  bool has_final = (derived
                    && derived->f2k_derived
                    && derived->f2k_derived->finalizers);

just to be consistent.

I am unassigning for now to pass this PR to you!  :-)


(BTW: running f951 under valgrind shows many invalid reads for my extension
of your testcase above.)

Reply via email to