A Fortran feature history cheat sheet

.. contents::
   :local:

Original IBM 704 FORTRAN

Features marked with asterisks * were gone by FORTRAN IV.

  • Fixed form input with comment and continuation cards
  • INTEGER and REAL types, implicit naming conventions
  • DIMENSION and EQUIVALENCE statements
  • Assignment statements
  • Arithmetic (3-way) IF statement
  • IF statements for checking exceptions and sense switches, manipulating lights
  • GO TO, computed GO TO, ASSIGN, and assigned GO TO statements
  • DO loops: positive expressions, 1 trip minimum
  • extended DO loop ranges
  • PAUSE, STOP, and CONTINUE statements
  • Formatted I/O: FORMAT, READ, WRITE, PRINT, PUNCH and * READ INPUT / WRITE OUTPUT TAPE
  • Unformatted I/O: READ/WRITE * TAPE/DRUM
  • ENDFILE, REWIND, and BACKSPACE statements
  • FREQUENCY statement (optimization hint - survived into FORTRAN IV)
  • Hollerith constants
  • Intrinsic functions (all names ending in F*)
  • statement functions (names ending in F only*)

FORTRAN II

  • SUBROUTINE and FUNCTION subprograms
  • END statement (with five Sense Switch override argument*) (Sense Switch 4, if on: “Causes FORTRAN II to produce a program optimized with respect to index registers.”)
  • CALL and RETURN statements
  • COMMON (blank only)
  • DOUBLE PRECISION and (single) COMPLEX data types
  • 6-character identifiers
  • Bitwise assignment statements with ‘B’ in column 1 (IBM 7090 only)
  • Double precision with ‘D’ in column 1 (ditto); complex with ‘I’; funcs with ‘F’

FORTRAN IV

  • DATA statement
  • labeled COMMON
  • BLOCK DATA subprograms
  • LOGICAL type and expressions, logical IF statement
  • Removal of weird original features (* above)
  • Quoted character strings
  • NAMELIST
  • EXTERNAL subprograms for use as actual arguments
  • alternate RETURN, ENTRY
  • &666 label actual arguments for assigned GO TO alternate return
  • implicit RETURN at END

FORTRAN 66

  • max 3 array dimensions; subscripts only like C*V+K; lower bounds all 1
  • adjustable array dummy arguments (dimension of dummy array is dummy argument)

FORTRAN 77

  • array dimension lower bounds other than 1
  • IF THEN / ELSE IF THEN / ELSE / END IF construct
  • DO loops with negative expressions and zero trip counts
  • OPEN, CLOSE, and INQUIRE statements
  • Direct-access I/O
  • IMPLICIT statement (was in FORTRAN IV)
  • CHARACTER data type (was in FORTRAN IV)
  • PARAMETER statement
  • SAVE statement
  • Generic intrinsic names
  • lexical string comparisons
  • Obsolescent or deleted features: Hollerith constants and data; H edit descriptors; overindexing; extended range DO loops
  • (non-standard option) recursion
  • .EQV. and .NEQV.
  • implicit RETURN at END

MIL-STD-1753 Fortran (1978)

  • DO WHILE, DO / END DO
  • INCLUDE statement
  • IMPLICIT NONE
  • Bit manipulation intrinsics (IAND, IOR, IEOR, ISHFT, ISHFTC, MVBITS, &c.)

Fortran 90

  • ALLOCATABLE attribute/statement, ALLOCATE and DEALLOCATE statements
  • keyword= actual arguments
  • Derived TYPEs, PRIVATE, SEQUENCE; structure components
  • Modules
  • POINTER and TARGET attributes, NULLIFY statement
  • Free form source
  • Long identifiers
  • Inline ! comments
  • Array expressions and assignments
  • WHERE construct
  • RECURSIVE procedures
  • INTERFACE
  • generic procedures
  • operator overloading
  • new declaration syntax with ::
  • EXIT and CYCLE statements
  • SELECT CASE construct
  • Portable kind specifications
  • INTENT on arguments
  • Obsolescent features beyond those removed in Fortran 95 below: alternate return, computed GO TO, statement functions, intermixed DATA, CHARACTER*x form, assumed-length CHARACTER*(*) functions, fixed form source

Fortran 95 (acquiring some HPF features)

  • FORALL construct
  • nested WHERE
  • Default initialization of derived type components
  • initialization of pointers to NULL()
  • (clarification) automatic DEALLOCATE at end of scope
  • extended intrinsics, e.g. DIM= arguments
  • PURE subprograms
  • removed features (obsolescent in Fortran 90): floating-point DO index variables, GO TO an END IF from outside, PAUSE statement, ASSIGN statement and assigned GO TO and formats, H edit descriptor

Fortran 2003

  • KIND and LEN parameterized derived types (still not widely available with correct implementations)
  • PROCEDURE pointers and pointer components
  • FINAL subroutines
  • type-bound procedures
  • GENERIC bindings
  • PASS attribute
  • type-bound generic OPERATOR(+) and ASSIGNMENT(=)
  • EXTENDS(type)
  • type-bound procedure overriding; NON_OVERRIDABLE attribute to prevent it
  • ENUM / ENUMERATOR :: / END ENUM
  • ASSOCIATE / END ASSOCIATE construct
  • CLASS polymorphic declarator
  • SELECT TYPE / END SELECT construct, TYPE IS and CLASS IS clauses
  • Abstract interface allowed on DEFERRED type-bound procedure meant to be overridden
  • Structure constructors with keyword=
  • ALLOCATE statement now works on scalars
  • Assignment to allocatable array with automatic (re)allocation
  • CALL MOVE_ALLOC(from, to) intrinsic
  • Finer-grained PUBLIC/PRIVATE
  • PROTECTED attribute and statement
  • USE module, OPERATOR(.foo.) => OPERATOR(.bar.)
  • Lower bounds on pointer assignment; expansion of vector RHS to multidimensional pointer
  • INTENT allowed on POINTER dummy argument, defined to pertain to the pointer rather than to its target
  • VOLATILE attribute
  • IMPORT statement in INTERFACEs
  • ISO_FORTRAN_ENV intrinsic module
  • Unicode, SELECTED_CHAR_KIND()
  • 63-char names and 256-line statements
  • BOZ constants in INT/REAL/CMPLX/DBLE intrinsic calls
  • [array constant] with optional [type::...] specifier
  • Named constants in complex constant values
  • SYSTEM_CLOCK(COUNT_RATE=real type) now allowed
  • MAX, MAXLOC, MAXVAL, MIN, MINLOC, MINVAL on CHARACTER
  • Negative zero on ATAN2, LOG, SQRT
  • IEEE underflow control
  • Derived type I/O: DT edit, GENERIC READ/WRITE bindings
  • ASYNCHRONOUS attribute and I/O, WAIT statement
  • FLUSH statement
  • IOMSG=str
  • OPEN(ACCESS=‘STREAM’)
  • OPEN(ROUND=mode), overrides on READ/WRITE; Rx edits
  • OPEN(DECIMAL=COMMA/POINT), overrides on READ/WRITE; DC and DP edits
  • OPEN(SIGN=)
  • KIND= type parameters allowed on specifiers, e.g. NEXTREC=n for cases where n is not default kind of INTEGER
  • Recursive I/O (also mentioned in Fortran 2008)
  • NEW_LINE()
  • I/O of IEEE-754 negative zero, infinities and NaNs
  • Fortran 66-style optional comma in 2P[,]2E12.4 edit descriptor
  • Interoperability with C

Fortran 2008

  • SUBMODULE, MODULE PROCEDURE
  • Coarray references and image control statements
  • DO CONCURRENT as a non-parallel construct
  • CONTIGUOUS attribute and statement, IS_CONTIGUOUS() intrinsic
  • Simply contiguous arrays
  • Maximum rank now 15
  • 64-bit INTEGER required as SELECTED_INT_KIND(18)
  • ALLOCATABLE members with recursive types
  • Implied-shape array declarations, e.g. INTEGER :: x(0:*) = [0, 1, 2]
  • Pointer association initialization in declaration with => to SAVE target
  • Generalization of expressions allowed in DATA statement subscripts and implied DO subexpressions
  • FORALL(INTEGER(kind) :: ...) kind specification
  • Intrinsic types in TYPE statements, e.g. TYPE(INTEGER)
  • Multiple type-bound procedures on one PROCEDURE statement
  • Structure constructors can omit ALLOCATABLE components
  • ALLOCATE(arr, SOURCE=x or MOLD=x) sets shape without needing explicit bounds on arr
  • ALLOCATE(polymorphic, MOLD=x) sets type
  • z%RE, z%IM
  • POINTER-valued functions as variables suitable for LHS of =, &c.
  • OPEN(NEWUNIT=u)
  • G0 edit descriptor
  • (*(...)) format item unlimited repetition
  • Recursive I/O
  • BLOCK construct
  • EXIT statement for constructs other than DO
  • STOP statement constant generalized
  • BGE(), BGT(), BLE(), BLT() unsigned integer comparisons
  • DSHIFTL(), DSHIFTR()
  • LEADZ(), POPCNT(), POPPAR(), TRAILZ()
  • MASKL(), MASKR()
  • SHIFTL(), SHIFTR(), SHIFTA()
  • MERGE_BITS()
  • IALL(), IANY(), IPARITY()
  • STORAGE_SIZE() in bits
  • RADIX argument to SELECTED_REAL_KIND()
  • COMPLEX arguments to ACOS et al.
  • ACOSH(), ASINH(), ATANH()
  • ATAN(x,y) synonym for ATAN2()
  • Bessel functions
  • ERF(), ERFC(), ERFC_SCALED(), GAMMA(), HYPOT(), LOG_GAMMA()
  • NORM2()
  • PARITY()
  • CALL EXECUTE_COMMAND_LINE()
  • MINLOC(BACK=.TRUE.), MAXLOC(BACK=.TRUE.)
  • FINDLOC()
  • More constants and functions in intrinsic module ISO_FORTRAN_ENV.
  • Implicit SAVE attribute assumed for module/submodule variables, procedure pointers, and COMMON blocks.
  • CONTAINS section can be empty in a procedure or type.
  • Internal procedures may be passed as actual arguments and assigned to procedure pointers.
  • Null pointer or unallocated allocatable may be passed to OPTIONAL dummy argument, which then appears to not be present.
  • POINTER INTENT(IN) dummy arg may be associated with non-pointer TARGET actual
  • Refinement of GENERIC resolution rules on pointer/allocatable, data/procedure
  • IMPURE for ELEMENTAL procedures (still PURE by default of course)
  • Obsolescence of ENTRY
  • A source line can begin with a semicolon.

Fortran 2018

  • Obsolescence of COMMON, EQUIVALENCE, BLOCK DATA, FORALL, labeled DO, specific names for generic intrinsics
  • Arithmetic IF and non-block DO deleted
  • Constant properties of an object can be used in its initialization
  • Implied DO variables can be typed in array constructors and DATA
  • Assumed-rank arrays with DIMENSION(..), SELECT RANK construct
  • A file can be opened on multiple units
  • Advancing input with SIZE=
  • G0.d for integer, logical, character
  • D0.d, E0.d, EN0.d, ES0.d, Ew.dE0, &c.
  • EX hex floating-point output; hex acceptable for floating-point input
  • Variable stop code allowed in (ERROR) STOP
  • new COSHAPE, OUT_OF_RANGE, RANDOM_INIT, REDUCE intrinsics
  • minor tweaks to extant intrinsics
  • IMPORT statement for BLOCK and contained subprograms
  • IMPLICIT NONE can require explicit EXTERNAL
  • RECURSIVE becomes default; NON_RECURSIVE added
  • DO CONCURRENT locality clauses