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

Bernd Edlinger <bernd.edlinger at hotmail dot de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bernd.edlinger at hotmail dot 
de

--- Comment #6 from Bernd Edlinger <bernd.edlinger at hotmail dot de> ---
(In reply to Mikael Morin from comment #5)
> (In reply to Mikael Morin from comment #4)
> > This cures it:
> 
> Another way to cure it:
> 
> Index: trans-expr.c
> ===================================================================
> --- trans-expr.c      (révision 220514)
> +++ trans-expr.c      (copie de travail)
> @@ -3783,10 +3783,6 @@ gfc_apply_interface_mapping_to_expr (gfc_interface
>         expr->symtree = sym->new_sym;
>       else if (sym->expr)
>         gfc_replace_expr (expr, gfc_copy_expr (sym->expr));
> -     /* Replace base type for polymorphic arguments.  */
> -     if (expr->ref && expr->ref->type == REF_COMPONENT
> -         && sym->expr && sym->expr->ts.type == BT_CLASS)
> -       expr->ref->u.c.sym = sym->expr->ts.u.derived;
>        }
>  
>        /* ...and to subexpressions in expr->value.  */

unfortunately this would make class_41.f03 fail.

class_41.f03 is very similar to this test case.

Both do deliberately pass a subclass to the base class,
just class_41.f03 uses identical pointer/allocatable attributes,
while this test case uses different pointer/allocatable attributes,
and this satisfies the condition in r218584.

However the intention of r214584 was to avoid aliasing
violations between class objects of the _same_ class type and different
pointer/allocatable attributes.  Additionally to cause problems
(at least on ARM, but in theory on any target too...)
the class with the wrong attributes must be passed to a subroutine.
See PR60718 for details.


I see no aliasing problems in this example if we avoid to cast
the class type to the destination class type.  And the value is
not passed to a subroutine.

So I would add the following to the condition that make the
new block only execute if both objects are of the same class.


Index: gcc/fortran/trans-expr.c
===================================================================
--- gcc/fortran/trans-expr.c    (revision 220543)
+++ gcc/fortran/trans-expr.c    (working copy)
@@ -4539,6 +4539,8 @@
             }
           else if (e->ts.type == BT_CLASS && fsym
                && fsym->ts.type == BT_CLASS
+               && CLASS_DATA (fsym)->ts.u.derived
+                  == CLASS_DATA (e)->ts.u.derived
                && !CLASS_DATA (fsym)->as
                && !CLASS_DATA (e)->as
                && (CLASS_DATA (fsym)->attr.class_pointer


With this patch all fortran test cases pass on x86_64.
And the ICE goes away in the reduced test example.
Does it work for you?

Reply via email to