Intel® Fortran Compiler 17.0 Developer Guide and Reference

SAVE

Statement and Attribute: Causes the values and definition of objects to be retained after execution of a RETURN or END statement in a subprogram.

The SAVE attribute can be specified in a type declaration statement or a SAVE statement, and takes one of the following forms:

Type Declaration Statement:

type,[att-ls,] SAVE [, att-ls] :: entity[, entity ] ...

Statement:

SAVE [[::]entity [, entity ] ...]

type

Is a data type specifier.

att-ls

Is an optional list of attribute specifiers.

entity

Is the name of an object, the name of a procedure pointer, or the name of a common block enclosed in slashes (/common-block-name/).

Description

In Intel® Fortran, certain variables are given the SAVE attribute, or not, by default:

Note

Certain compiler options (such as options [Q]save and automatic) and the use of OpenMP* features can change the defaults.

To enhance portability and avoid possible compiler warning messages, Intel recommends that you use the SAVE statement to name variables whose values you want to preserve between subprogram invocations.

When a SAVE statement does not explicitly contain a list, all allowable items in the scoping unit are saved.

A SAVE statement cannot specify the following (their values cannot be saved):

Even though a common block can be included in a SAVE statement, individual variables within the common block can become undefined (or redefined) in another scoping unit.

If a common block is saved in any scoping unit of a program (other than the main program), it must be saved in every scoping unit in which the common block appears.

A SAVE statement has no effect in a main program.

Example

The following example shows a type declaration statement specifying the SAVE attribute:

SUBROUTINE TEST()
  REAL, SAVE :: X, Y

The following is an example of the SAVE statement:

SAVE A, /BLOCK_B/, C, /BLOCK_D/, E

The following shows another example:

  SUBROUTINE MySub
    COMMON /z/ da, in, a, idum(10)
    real(8) x,y
    ...

    SAVE x, y, /z/
! alternate declaration
    REAL(8), SAVE :: x, y
    SAVE /z/

See Also