08-245 To: J3 From: Michael Ingrassia Subject: Public Comment J32031 Date: 2008 July 08 ---------------------------------------------------------------------- Commenter's Subject was "equivalence of circular types" The draft Fortran standard allow circular type definitions (see Section 4.5.3). Type equivalence for derived types that do not have the SEQUENCE property or the BIND attribute is trivial, they are equivalent only if they are defined by the same derived-type definition. For type that have the SEQUENCE property or the BIND attribute, type equivalence is defined in terms of a hybrid of structural equivalence and name equivalence. This hybrid condition is easier to test than pure structural equivalence, but harder to test than pure name equivalence. Like other definitions of type equivalence based on structural equivalence, the definition of the equivalence of two circular types is tricky. The draft Fortran standard avoids this problem by not defining what it means for two circular types to be equivalent. Consider the program MODULE MOD TYPE T1 SEQUENCE INTEGER I TYPE(T2), POINTER :: P END TYPE TYPE T2 SEQUENCE INTEGER I TYPE(T1), POINTER :: P END TYPE END PROGRAM MAIN USE MOD, ONLY: T3 => T1, T4 => T2 TYPE T1 SEQUENCE INTEGER I TYPE(T2), POINTER :: P END TYPE TYPE T2 SEQUENCE INTEGER I TYPE(T1), POINTER :: P END TYPE TYPE(T1) :: X TYPE(T3) :: Y Y%I = 1 NULLIFY(Y%P) X = Y END The types T1 and T2 defined in the module might or might not be equivalent to the types T1 and T2 defined in the main program depending on the definition of type equivalence for types with circular definitions. Because the standard does not provide such a definition, implementors have had to supply their own definitions. I have found three distinct definitions implemented by different compilers. In the case of the example given above, Sun Fortran considers the types T1 and T2 defined in the module to be equivalent to the types T1 and T2 defined in the main program. A compiler from another vendor considers them to be different and produces the error message fortcom: Error: testa.f, line 32: An assignment of different structure types is invalid. [Y] X = Y ............^ compilation aborted for testa.f (code 1) when it tries to compile the code above. I know two ways to precisely define structural equivalence of circular types. One is to give an algorithm for testing type equivalence. The other is to define type equivalence in terms of equivalence classes. Either approach will be considerably long and more complicated than the definition of derived-type equivalence given in the draft standard. ----------------------------------------------------------------------