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

--- Comment #20 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Mikael Morin <mik...@gcc.gnu.org>:

https://gcc.gnu.org/g:fa5cd7102da676dcb1757b1288421f5f3439ae0e

commit r12-8235-gfa5cd7102da676dcb1757b1288421f5f3439ae0e
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sun Apr 24 15:05:41 2022 +0200

    fortran: Detect duplicate unlimited polymorphic types [PR103662]

    This fixes a type-based alias analysis issue with unlimited polymorphic
    class descriptors (types behind class(*)) causing data initialisation to
    be removed by optimization.

    The fortran front-end may create multiple declarations for types, for
    example if a type is redeclared in each program unit it is used in.
    To avoid optimization seeing them as non-aliasing, a list of derived
    types is created at resolution time, and used at translation to set
    the same TYPE_CANONICAL type for each duplicate type declaration.

    This mechanism didnât work for unlimited polymorphic descriptors types,
    as there is a short-circuit return skipping all the resolution handling
    for them, including the type registration.

    This change adds type registration at the short-circuit return, and
    updates type comparison to handle specifically unlimited polymorphic
    fake symbols, class descriptor types and virtual table types.

    The test, which exhibited mismatching dynamic types had to be fixed as
    well.

            PR fortran/103662

    gcc/fortran/ChangeLog:

            * interface.cc (gfc_compare_derived_types): Support comparing
            unlimited polymorphic fake symbols.  Recursively compare class
            descriptor types and virtual table types.
            * resolve.cc (resolve_fl_derived): Add type to the types list
            on unlimited polymorphic short-circuit return.

    gcc/testsuite/ChangeLog:

            * gfortran.dg/unlimited_polymorphic_3.f03 (foo): Separate
            bind(c) and sequence checks to...
            (foo_bc, foo_sq): ... two different procedures.
            (main, foo*): Change type declarations so that type name,
            component name, and either bind(c) or sequence attribute match
            between the main type declarations and the procedure type
            declarations.
            (toplevel): Add optimization dump checks.

    Co-Authored-By: Jakub Jelinek <ja...@redhat.com>

Reply via email to