This was discussed earlier in this thread, although it is now getting difficult to locate specific posts because of the long thread length. Prior to f90, there was only one integer type, one logical type, one complex type, and two real types. F77 also allowed only one real type to be supported as a subset, but I’ll ignore that complication here. F77 also had characters, but it did not define how character storage sequences mixed with the numeric storage sequences. The f77 standard allowed all of those types to be equivalenced and to be storage associated in common blocks. It defined that association through numeric storage units, not through addresses. Namely, everything was one storage unit except for DOUBLE PRECISION and COMPLEX which occupied two storage units each.
Type punning through dummy argument lists is related to this, but its behavior was never defined by the standard. Fortran programmers of that era did this all the time in order to reuse workspace when memory was limited and for low-level bit fiddling. I certainly did it, and I have legacy code that still does it. But it was not defined by the standard, and there was always the possibility that a standard conforming compiler would either reject it, or would accept it and not do what I expected. As a practical matter, that never happened. Compilers always did what was expected in these cases, and if they did detect the standards violation and print a warning, there were always ways to ignore or override those warnings.
Pre f90 compilers often supported other types too. The common notation was LOGICAL*1, INTEGER*2, INTEGER*8, REAL*16, COMPLEX*16, and so on. These were never part of the fortran standard, and the storage sequence association of these types were never defined by the standard. It was possible to write portable code that used these declarations, but the programmer had to be careful. On the other hand, the computer vendors loved it when programmers used these extensions because it locked in their customers to keep buying their hardware and software. Thus the dilemma that was faced by us programmers of that era.
When f90 introduced the KIND system, it replaced all of that nonstandard notation with a general and open-ended approach. I’m a big fan of the fortran KIND system. So now it was possible to decalare and use all of these different types and kinds, but the programmer must still be careful because of portability. There were still only one integer kind and two real kinds that were required by the f90 standard, everything else is extra. More recently, the standard requires also support for an extended integer kind (at least 18 decimal digits). But the fortran standard has never defined the behavior of either EQUIVALENCE or storage sequence association for all of these different TYPES and KINDS, beyond what was specified for the default intrinsic types in the previous standards. So it looks like we have that only because of backwards compatibility with the pre-f90 standards.
So I don’t think it is correct to say that the fortran standard has imposed new restrictions on EQUIVALENCE. It is rather than they have continued on with what was in the previous standards without extending it to the newer type-kind system. Now EQUIVALENCE has been designated as obsolete. Common blocks are also on the black list, either obsolete or deprecated, I forget which. That is how the language has been evolving over the last 60 years.
If FortranFan is correct in his interpretations of the fortran and C standards, the C interoperability facilities actually provide some standard-conforming ways to effectively equivalence types and kinds that were not covered with the backwards-compatibilty of EQUIVALENCE and storgage sequence requirements. TRANSFER() also does some of this in ways that are both more restrictive and more general than the old approaches. In a separate thread, I pointed out that if the intrinsic subroutine MVBITS() were generalized only a little, then it would allow entirely portable code to be written that bypassed even the little- and big-endian addressing problems that are inherent in the type-punning, equivalence, and storage association approaches. So there are ways for fortran to move forward in positive and productive ways from its present position.