fortran: Detect duplicate unlimited polymorphic types [PR103662]
authorMikael Morin <mikael@gcc.gnu.org>
Sun, 24 Apr 2022 13:05:41 +0000 (15:05 +0200)
committerMikael Morin <mikael@gcc.gnu.org>
Sun, 24 Apr 2022 13:05:41 +0000 (15:05 +0200)
commitfa5cd7102da676dcb1757b1288421f5f3439ae0e
treead25ead238ade82a8702219169912630b4b39bb4
parentafe0b5b7ce597641f02d47f0384610fb078a2cb7
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 <jakub@redhat.com>
gcc/fortran/interface.cc
gcc/fortran/resolve.cc
gcc/testsuite/gfortran.dg/unlimited_polymorphic_3.f03