summaryrefslogtreecommitdiff
path: root/flang/docs/Extensions.md
diff options
context:
space:
mode:
Diffstat (limited to 'flang/docs/Extensions.md')
-rw-r--r--flang/docs/Extensions.md192
1 files changed, 192 insertions, 0 deletions
diff --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md
new file mode 100644
index 000000000000..9010b770cca6
--- /dev/null
+++ b/flang/docs/Extensions.md
@@ -0,0 +1,192 @@
+<!--===- docs/Extensions.md
+
+ Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ See https://llvm.org/LICENSE.txt for license information.
+ SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+-->
+
+As a general principle, this compiler will accept by default and
+without complaint many legacy features, extensions to the standard
+language, and features that have been deleted from the standard,
+so long as the recognition of those features would not cause a
+standard-conforming program to be rejected or misinterpreted.
+
+Other non-standard features, which do conflict with the current
+standard specification of the Fortran programming language, are
+accepted if enabled by command-line options.
+
+Intentional violations of the standard
+======================================
+* Scalar `INTEGER` actual argument expressions (not variables!)
+ are converted to the kinds of scalar `INTEGER` dummy arguments
+ when the interface is explicit and the kinds differ.
+ This conversion allows the results of the intrinsics like
+ `SIZE` that (as mentioned below) may return non-default
+ `INTEGER` results by default to be passed. A warning is
+ emitted when truncation is possible.
+* We are not strict on the contents of `BLOCK DATA` subprograms
+ so long as they contain no executable code, no internal subprograms,
+ and allocate no storage outside a named `COMMON` block. (C1415)
+
+Extensions, deletions, and legacy features supported by default
+===============================================================
+* Tabs in source
+* `<>` as synonym for `.NE.` and `/=`
+* `$` and `@` as legal characters in names
+* Initialization in type declaration statements using `/values/`
+* Kind specification with `*`, e.g. `REAL*4`
+* `DOUBLE COMPLEX`
+* Signed complex literal constants
+* DEC `STRUCTURE`, `RECORD`, `UNION`, and `MAP`
+* Structure field access with `.field`
+* `BYTE` as synonym for `INTEGER(KIND=1)`
+* Quad precision REAL literals with `Q`
+* `X` prefix/suffix as synonym for `Z` on hexadecimal literals
+* `B`, `O`, `Z`, and `X` accepted as suffixes as well as prefixes
+* Triplets allowed in array constructors
+* Old-style `PARAMETER pi=3.14` statement without parentheses
+* `%LOC`, `%VAL`, and `%REF`
+* Leading comma allowed before I/O item list
+* Empty parentheses allowed in `PROGRAM P()`
+* Missing parentheses allowed in `FUNCTION F`
+* Cray based `POINTER(p,x)` and `LOC()` intrinsic (with `%LOC()` as
+ an alias)
+* Arithmetic `IF`. (Which branch should NaN take? Fall through?)
+* `ASSIGN` statement, assigned `GO TO`, and assigned format
+* `PAUSE` statement
+* Hollerith literals and edit descriptors
+* `NAMELIST` allowed in the execution part
+* Omitted colons on type declaration statements with attributes
+* COMPLEX constructor expression, e.g. `(x+y,z)`
+* `+` and `-` before all primary expressions, e.g. `x*-y`
+* `.NOT. .NOT.` accepted
+* `NAME=` as synonym for `FILE=`
+* Data edit descriptors without width or other details
+* `D` lines in fixed form as comments or debug code
+* `CONVERT=` on the OPEN and INQUIRE statements
+* `DISPOSE=` on the OPEN and INQUIRE statements
+* Leading semicolons are ignored before any statement that
+ could have a label
+* The character `&` in column 1 in fixed form source is a variant form
+ of continuation line.
+* Character literals as elements of an array constructor without an explicit
+ type specifier need not have the same length; the longest literal determines
+ the length parameter of the implicit type, not the first.
+* Outside a character literal, a comment after a continuation marker (&)
+ need not begin with a comment marker (!).
+* Classic C-style /*comments*/ are skipped, so multi-language header
+ files are easier to write and use.
+* $ and \ edit descriptors are supported in FORMAT to suppress newline
+ output on user prompts.
+* REAL and DOUBLE PRECISION variable and bounds in DO loops
+* Integer literals without explicit kind specifiers that are out of range
+ for the default kind of INTEGER are assumed to have the least larger kind
+ that can hold them, if one exists.
+* BOZ literals can be used as INTEGER values in contexts where the type is
+ unambiguous: the right hand sides of assigments and initializations
+ of INTEGER entities, and as actual arguments to a few intrinsic functions
+ (ACHAR, BTEST, CHAR). But they cannot be used if the type would not
+ be known (e.g., `IAND(X'1',X'2')`).
+* BOZ literals can also be used as REAL values in some contexts where the
+ type is unambiguous, such as initializations of REAL parameters.
+* EQUIVALENCE of numeric and character sequences (a ubiquitous extension)
+* Values for whole anonymous parent components in structure constructors
+ (e.g., `EXTENDEDTYPE(PARENTTYPE(1,2,3))` rather than `EXTENDEDTYPE(1,2,3)`
+ or `EXTENDEDTYPE(PARENTTYPE=PARENTTYPE(1,2,3))`).
+* Some intrinsic functions are specified in the standard as requiring the
+ same type and kind for their arguments (viz., ATAN with two arguments,
+ ATAN2, DIM, HYPOT, MAX, MIN, MOD, and MODULO);
+ we allow distinct types to be used, promoting
+ the arguments as if they were operands to an intrinsic `+` operator,
+ and defining the result type accordingly.
+* DOUBLE COMPLEX intrinsics DREAL, DCMPLX, DCONJG, and DIMAG.
+* INT_PTR_KIND intrinsic returns the kind of c_intptr_t.
+* Restricted specific conversion intrinsics FLOAT, SNGL, IDINT, IFIX, DREAL,
+ and DCMPLX accept arguments of any kind instead of only the default kind or
+ double precision kind. Their result kinds remain as specified.
+* Specific intrinsics AMAX0, AMAX1, AMIN0, AMIN1, DMAX1, DMIN1, MAX0, MAX1,
+ MIN0, and MIN1 accept more argument types than specified. They are replaced by
+ the related generics followed by conversions to the specified result types.
+* When a scalar CHARACTER actual argument of the same kind is known to
+ have a length shorter than the associated dummy argument, it is extended
+ on the right with blanks, similar to assignment.
+* When a dummy argument is `POINTER` or `ALLOCATABLE` and is `INTENT(IN)`, we
+ relax enforcement of some requirements on actual arguments that must otherwise
+ hold true for definable arguments.
+* Assignment of `LOGICAL` to `INTEGER` and vice versa (but not other types) is
+ allowed. The values are normalized.
+* An effectively empty source file (no program unit) is accepted and
+ produces an empty relocatable output file.
+* A `RETURN` statement may appear in a main program.
+* DATA statement initialization is allowed for procedure pointers outside
+ structure constructors.
+
+Extensions supported when enabled by options
+--------------------------------------------
+* C-style backslash escape sequences in quoted CHARACTER literals
+ (but not Hollerith) [-fbackslash]
+* Logical abbreviations `.T.`, `.F.`, `.N.`, `.A.`, `.O.`, and `.X.`
+ [-flogical-abbreviations]
+* `.XOR.` as a synonym for `.NEQV.` [-fxor-operator]
+* The default `INTEGER` type is required by the standard to occupy
+ the same amount of storage as the default `REAL` type. Default
+ `REAL` is of course 32-bit IEEE-754 floating-point today. This legacy
+ rule imposes an artificially small constraint in some cases
+ where Fortran mandates that something have the default `INTEGER`
+ type: specifically, the results of references to the intrinsic functions
+ `SIZE`, `LBOUND`, `UBOUND`, `SHAPE`, and the location reductions
+ `FINDLOC`, `MAXLOC`, and `MINLOC` in the absence of an explicit
+ `KIND=` actual argument. We return `INTEGER(KIND=8)` by default in
+ these cases when the `-flarge-sizes` option is enabled.
+
+Extensions and legacy features deliberately not supported
+---------------------------------------------------------
+* `.LG.` as synonym for `.NE.`
+* `REDIMENSION`
+* Allocatable `COMMON`
+* Expressions in formats
+* `ACCEPT` as synonym for `READ *`
+* `TYPE` as synonym for `PRINT`
+* `ARRAY` as synonym for `DIMENSION`
+* `VIRTUAL` as synonym for `DIMENSION`
+* `ENCODE` and `DECODE` as synonyms for internal I/O
+* `IMPLICIT AUTOMATIC`, `IMPLICIT STATIC`
+* Default exponent of zero, e.g. `3.14159E`
+* Characters in defined operators that are neither letters nor digits
+* `B` suffix on unquoted octal constants
+* `Z` prefix on unquoted hexadecimal constants (dangerous)
+* `T` and `F` as abbreviations for `.TRUE.` and `.FALSE.` in DATA (PGI/XLF)
+* Use of host FORMAT labels in internal subprograms (PGI-only feature)
+* ALLOCATE(TYPE(derived)::...) as variant of correct ALLOCATE(derived::...) (PGI only)
+* Defining an explicit interface for a subprogram within itself (PGI only)
+* USE association of a procedure interface within that same procedure's definition
+* NULL() as a structure constructor expression for an ALLOCATABLE component (PGI).
+* Conversion of LOGICAL to INTEGER in expressions.
+* IF (integer expression) THEN ... END IF (PGI/Intel)
+* Comparsion of LOGICAL with ==/.EQ. rather than .EQV. (also .NEQV.) (PGI/Intel)
+* Procedure pointers in COMMON blocks (PGI/Intel)
+* Underindexing multi-dimensional arrays (e.g., A(1) rather than A(1,1)) (PGI only)
+* Legacy PGI `NCHARACTER` type and `NC` Kanji character literals
+* Using non-integer expressions for array bounds (e.g., REAL A(3.14159)) (PGI/Intel)
+* Mixing INTEGER types as operands to bit intrinsics (e.g., IAND); only two
+ compilers support it, and they disagree on sign extension.
+* Module & program names that conflict with an object inside the unit (PGI only).
+* When the same name is brought into scope via USE association from
+ multiple modules, the name must refer to a generic interface; PGI
+ allows a name to be a procedure from one module and a generic interface
+ from another.
+* Type parameter declarations must come first in a derived type definition;
+ some compilers allow them to follow `PRIVATE`, or be intermixed with the
+ component declarations.
+* Wrong argument types in calls to specific intrinsics that have different names than the
+ related generics. Some accepted exceptions are listed above in the allowed extensions.
+ PGI, Intel, and XLF support this in ways that are not numerically equivalent.
+ PGI converts the arguments while Intel and XLF replace the specific by the related generic.
+
+Preprocessing behavior
+======================
+* The preprocessor is always run, whatever the filename extension may be.
+* We respect Fortran comments in macro actual arguments (like GNU, Intel, NAG;
+ unlike PGI and XLF) on the principle that macro calls should be treated
+ like function references. Fortran's line continuation methods also work.