HP Fortran for OpenVMS
Language Reference 
Manual
Chapter 14
Compiler Directives
HP Fortran provides compiler directives to perform general-purpose 
tasks during compilation. You do not need to specify a compiler option 
to enable general directives.
Compiler directives are preceded by a special prefix that identifies 
them to the compiler.
This chapter describes:
  - Syntax rules for general directives ( Section 14.1)
  
 - ALIAS ( Section 14.2) 
Specifies an alternate external name to 
  be used when referring to external subprograms.
   - ATTRIBUTES ( Section 14.3) 
Specifies properties for data 
  objects and procedures.
   - DECLARE and NODECLARE ( Section 14.4) 
Generates or disables 
  warnings for variables that have been used but not declared.
   - DEFINE and UNDEFINE ( Section 14.5) 
Specifies a symbolic 
  variable whose existence (or value) can be tested during conditional 
  compilation.
   - FIXEDFORMLINESIZE ( Section 14.6) 
Sets the line length for 
  fixed-form source code.
   - FREEFORM and NOFREEFORM ( Section 14.7) 
Specifies free-format 
  or fixed-format source code.
   - IDENT ( Section 14.8) 
Specifies an identifier for an object 
  module.
   - IF and IF DEFINED ( Section 14.9) 
Specifies a conditional 
  compilation construct.
   - INTEGER ( Section 14.10) 
Specifies the default integer kind.
   - IVDEP ( Section 14.11) 
Assists the compiler's dependence 
  analysis.
   - MESSAGE ( Section 14.12) 
Specifies a character string to be 
  sent to the standard output device during the first compiler pass.
   - OBJCOMMENT ( Section 14.13) 
Specifies a library search path in 
  an object file.
   - OPTIONS ( Section 14.14) 
Affects data alignment and warnings 
  about data alignment.
   - PACK ( Section 14.15) 
Specifies the memory starting addresses 
  of derived-type items.
   - PSECT ( Section 14.16) 
Modifies certain characteristics of a 
  common block.
   - REAL ( Section 14.17) 
Specifies the default real kind.
   - STRICT and NOSTRICT ( Section 14.18) 
Disables or enables 
  language features not found in the language standard specified on the 
  command line (Fortran 95 or Fortran 90).
   - TITLE and SUBTITLE ( Section 14.19) 
Specifies a title or 
  subtitle for a listing header.
   - UNROLL ( Section 14.20) 
Tells the compiler's optimizer how many 
  times to unroll a DO loop.
 
14.1   Syntax Rules for General Directives   
The following general syntax rules apply to all general compiler 
directives. You must follow these rules precisely to compile your 
program properly and obtain meaningful results.
A general directive prefix (tag) takes the following form:
c
Is one of the following: C (or c), !, or *.
The following are source form rules for directive prefixes:
  - Prefixes beginning with C (or c) and * are only allowed in fixed 
  and tab source forms. 
In these source forms, the prefix must appear 
  in columns 1 through 5; column 6 must be a blank or tab. From column 7 
  on, blanks are insignificant, so the directive can be positioned 
  anywhere on the line after column 6.
   - Prefixes beginning with ! are allowed in all source forms. 
The 
  prefix can appear in any valid column, but it cannot be preceded by any 
  nonblank characters on the same line. It can only be preceded by 
  whitespace.
 
A general directive ends in column 72 (or column 132, if a compiler 
option is specified).
General directives cannot be continued.
A comment can follow a directive on the same line.
Additional Fortran statements (or directives) cannot appear on the same 
line as the general directive.
General directives cannot appear within a continued Fortran statement.
If a blank common is used in a general compiler directive, it must be 
specified as two slashes (/ /).
14.2   ALIAS Directive   
The ALIAS directive lets you specify an alternate external name to be 
used when referring to external subprograms. This can be useful when 
compiling applications written for other platforms that have different 
naming conventions.
The ALIAS directive takes the following form:
  
    
       
      
- cDEC$ ALIAS internal-name, external-name
  
     | 
  
c
Is one of the following: C (or c), !, or * (see Section 14.1).
internal-name
Is the name of the subprogram as used in the current program unit.
external-name
Is a name, or a character constant delimited by apostrophes or 
quotation marks.
If a name is specified, the name (in uppercase) is used as the external 
name for the specified internal-name. If a character constant 
is specified, it is used as is; the string is not changed to uppercase, 
nor are blanks removed.
The ALIAS directive affects only the external name used for references 
to the specified internal-name.
Names that are not acceptable to the linker will cause link-time errors.
For More Information:
  - On syntax rules for all general directives, see Section 14.1.
  
 - On the linker, see the HP OpenVMS Linker Utility Manual.
 
14.3   ATTRIBUTES Directive   
The ATTRIBUTES directive lets you specify properties for data objects 
and procedures. It takes the following form: 1
  
    
       
      
- cDEC$ ATTRIBUTES att [,att]... :: object [,object]...
  
     | 
  
c
Is one of the following: C (or c), !, or * (see Section 14.1).
att
Is one of the following:
  
    | 
      ADDRESS64
     | 
    
      DESCRIPTOR32
     | 
    
      REFERENCE
     | 
  
  
    | 
      ALIAS
     | 
    
      DESCRIPTOR64
     | 
    
      REFERENCE32
     | 
  
  
    | 
      ALLOW_NULL
     | 
    
       
     | 
    
      REFERENCE64
     | 
  
  
    | 
       
     | 
    
       
     | 
    
      STDCALL
     | 
  
  
    | 
      C
     | 
    
      EXTERN
     | 
    
      VALUE
     | 
  
  
    | 
      DECORATE
     | 
    
      IGNORE_LOC
     | 
    
      VARYING
     | 
  
  
    | 
      DEFAULT
     | 
    
      NO_ARG_CHECK
     | 
    
       
     | 
  
  
    | 
      DESCRIPTOR
     | 
    
      NOMIXED_STR_LEN_ARG
     | 
    
       
     | 
  
object
Is the name of a data object or procedure.
The following table shows which properties can be used with various 
objects:
  
    | Property  | 
     Variable and   Array Declarations  | 
    Common Block Names1  | 
    Subprogram Specification and EXTERNAL Statements  | 
  
  
    | 
       ADDRESS64
     | 
    
      Yes
     | 
    
      Yes
     | 
    
      No
     | 
  
  
    | 
       ALIAS
     | 
    
      No
     | 
    
      Yes
     | 
    
      Yes
     | 
  
  
    | 
       ALLOW_NULL
     | 
    
      Yes
     | 
    
      No
     | 
    
      No
     | 
  
  
    | 
       C
     | 
    
      No
     | 
    
      Yes
     | 
    
      Yes
     | 
  
  
    | 
       DECORATE
     | 
    
      No
     | 
    
      No
     | 
    
      Yes
     | 
  
  
    | 
       DEFAULT
     | 
    
      No
     | 
    
      Yes
     | 
    
      Yes
     | 
  
  
    | 
       DESCRIPTOR
     | 
    
      Yes
      2
     | 
    
      No
     | 
    
      No
     | 
  
  
    | 
       DESCRIPTOR32
     | 
    
      Yes
      2
     | 
    
      No
     | 
    
      No
     | 
  
  
    | 
       DESCRIPTOR64
     | 
    
      Yes
      2
     | 
    
      No
     | 
    
      No
     | 
  
  
    | 
       EXTERN
     | 
    
      Yes
     | 
    
      No
     | 
    
      No
     | 
  
  
    | 
       IGNORE_LOC
     | 
    
      Yes
     | 
    
      No
     | 
    
      No
     | 
  
  
    | 
       NO_ARG_CHECK
     | 
    
      Yes
     | 
    
      No
     | 
    
      Yes
      3
     | 
  
  
    | 
       NOMIXED_STR_LEN_ARG
     | 
    
      No
     | 
    
      No
     | 
    
      Yes
     | 
  
  
    | 
       REFERENCE
     | 
    
      Yes
     | 
    
      No
     | 
    
      Yes
     | 
  
  
    | 
       REFERENCE32
     | 
    
      Yes
     | 
    
      No
     | 
    
      No
     | 
  
  
    | 
       REFERENCE64
     | 
    
      Yes
     | 
    
      No
     | 
    
      No
     | 
  
  
    | 
       STDCALL
     | 
    
      No
     | 
    
      Yes
     | 
    
      Yes
     | 
  
  
    | 
       VALUE
     | 
    
      Yes
     | 
    
      No
     | 
    
      No
     | 
  
  
    | 
       VARYING
     | 
    
      No
     | 
    
      No
     | 
    
      Yes
     | 
  
1A common block name is specified as [/]common-block-name[/].
2This property can only be applied to INTERFACE blocks.
3This property cannot be applied to EXTERNAL statements.
These properties can be used in function and subroutine definitions, in 
type declarations, and with the INTERFACE and ENTRY statements.
Properties applied to entities available through use or host 
association are in effect during the association. For example, consider 
the following:
  
    
       
      
MODULE MOD1 
  INTERFACE 
    SUBROUTINE SUB1 
    !DEC$ ATTRIBUTES C, ALIAS:'othername' :: NEW_SUB 
    END SUBROUTINE 
  END INTERFACE 
  CONTAINS 
    SUBROUTINE SUB2 
    CALL NEW_SUB 
    END SUBROUTINE 
END MODULE 
 | 
In this case, the call to NEW_SUB within SUB2 uses the C and ALIAS 
properties specified in the interface block.
The properties are described as follows:
  - ADDRESS64 
 Specifies that the object has a 64-bit address. This property can be 
 specified for any variable or dummy argument, including ALLOCATABLE and 
 deferred-shape arrays. However, variables with this property cannot be 
 data-initialized. 
 It can also be specified for COMMON blocks or 
 for variables in a COMMON block. If specified for a COMMON block 
 variable, the COMMON block implicitly has the ADDRESS64 property. 
 
ADDRESS64 is not compatible with the AUTOMATIC attribute.
   - ALIAS 
Specifies an alternate external name to be used when referring to 
external subprograms. Its form is:
external-name
Is a character constant delimited by apostrophes or quotation marks. 
The character constant is used as is; the string is not changed to 
uppercase, nor are blanks removed.
    
The ALIAS property overrides the C (and STDCALL) property. If both 
    C and ALIAS are specified for a subprogram, the subprogram is given the 
    C calling convention, but not the C naming convention. It instead 
    receives the name given for ALIAS, with no modifications. 
ALIAS 
    cannot be used with internal procedures, and it cannot be applied to 
    dummy arguments. 
cDEC$ ATTRIBUTES ALIAS has the same effect as the 
    cDEC$ ALIAS directive (see Section 14.2).
   - ALLOW_NULL
    
Enables a corresponding dummy argument to pass a NULL pointer 
    (defined by a zero or the NULL intrinsic function) by value for the 
    argument. 
ALLOW_NULL is only valid if the REFERENCE property is 
    also specified; otherwise, it has no effect.
   - C and STDCALL 
Specify how data is to be passed when you use routines written in C or 
assembler with FORTRAN or Fortran 95/90 routines. 
C and STDCALL are 
synonyms. 
When applied to a subprogram, these properties define the 
subprogram as having a specific set of calling conventions. 
The 
following table summarizes the differences between the calling 
conventions:
  
    | Convention  | 
    C1  | 
    STDCALL1  | 
    Default2  | 
  
  
    | 
       Arguments passed by value
     | 
    
      Yes
     | 
    
      Yes
     | 
    
      No
     | 
  
1C and STDCALL are synonyms.
2Fortran 95/90 calling convention.
    
If C or STDCALL is specified for a subprogram, arguments (except 
    for arrays and characters) are passed by value. Subprograms using 
    standard Fortran 95/90 conventions pass arguments by reference. 
    
Character arguments are passed as follows:
  
    - By default, hidden lengths are put at the end of the argument list.
    
 - If C or STDCALL (only) is specified, the first character of the 
    string is passed (and padded with zeros out to INTEGER(4) length).
    
 - If C or STDCALL is specified, and REFERENCE is specified for the 
    argument, the string is passed but the length is not passed.
    
 - If C or STDCALL is specified, and REFERENCE is specified for the 
    routine (but REFERENCE is not specified for the argument, if 
    any), the string is passed but the length is not passed.
  
 
    
For details, see information on mixed-language programming in the 
    HP Fortran for OpenVMS User Manual. See also the description of REFERENCE in this list.
   - DECORATE
    
Specifies that the external name used in cDEC$ ALIAS or cDEC$ 
    ATTRIBUTES ALIAS should have the prefix and postfix decorations 
    performed on it that are associated with the calling mechanism that is 
    in effect. These are the same decorations performed on the procedure 
    name when ALIAS is not specified. 
The case of the external name is 
    not modified. 
If ALIAS is not specified, this property has no 
    effect. 
See also the summary of prefix and postfix decorations in 
    the above description of ATTRIBUTES options C and STDCALL.
   - DEFAULT 
Overrides certain compiler options that can affect external routine and 
COMMON block declarations. 
It specifies that the compiler should 
ignore compiler options that change the default conventions for 
external symbol naming and argument passing for routines and COMMON 
blocks. 
This option can be combined with other cDEC$ ATTRIBUTES 
options, such as STDCALL, C, REFERENCE, ALIAS, etc. to specify 
attributes different from the compiler defaults. 
This option is 
useful when declaring INTERFACE blocks for external routines, since it 
prevents compiler options from changing calling or naming conventions.
   - DESCRIPTOR 
 Specifies that the argument is passed by VMS descriptor. This property 
 can be specified only for dummy arguments in an INTERFACE block 
 (not for a routine name).
   - DESCRIPTOR32 
 Specifies that the argument is passed as a 32-bit descriptor.
   - DESCRIPTOR64 
 Specifies that the argument is passed as a 64-bit descriptor.
   - EXTERN 
Specifies that a variable is allocated in another source file. EXTERN 
can be used in global variable declarations, but it must not be applied 
to dummy arguments. 
EXTERN must be used when accessing variables 
declared in other languages.
   - IGNORE_LOC
    
Enables %LOC to be stripped from an argument. 
IGNORE_LOC is 
    only valid if the REFERENCE property is also specified; otherwise, it 
    has no effect.
   - NO_ARG_CHECK 
Specifies that type and shape matching rules related to explicit 
interfaces are to be ignored. This permits the construction of an 
INTERFACE block for an external procedure or a module procedure that 
accepts an argument of any type or shape; for example, a memory copying 
routine. 
NO_ARG_CHECK can appear only in an INTERFACE block for a 
non-generic procedure or in a module procedure. It can be applied to an 
individual dummy argument name or to the routine name, in which case 
the property is applied to all dummy arguments in that interface. 
NO_ARG_CHECK cannot be used for procedures with the PURE or 
ELEMENTAL prefix. If an argument has an INTENT or OPTIONAL attribute, 
any NO_ARG_CHECK specification is ignored.
   - NOMIXED_STR_LEN_ARG
    
Specifies that hidden lengths be placed in sequential order at the 
    end of the argument list.
   - REFERENCE and VALUE 
Specify how a dummy argument is to be passed. 
REFERENCE specifies a 
dummy argument's memory location is to be passed instead of the 
argument's value. 
VALUE specifies a dummy argument's value is to be 
passed instead of the argument's memory location. 
When a dummy 
argument has the VALUE property, the actual argument passed to it can 
be of a different type. If necessary, type conversion is performed 
before the subprogram is called. 
When a complex (KIND=4 or KIND=8) 
argument is passed by value, two floating-point arguments (one 
containing the real part, the other containing the imaginary part) are 
passed by immediate value. 
Character values, substrings, 
assumed-size arrays, and adjustable arrays cannot be passed by value. 
If REFERENCE (only) is specified for a character argument, the 
string is passed but the length is not passed. 
If REFERENCE is 
specified for a character argument, and C (or STDCALL) has been 
specified for the routine, the string is passed with no length. This is 
true even if REFERENCE is also specified for the routine. 
If 
REFERENCE and C (or STDCALL) are specified for a routine, but REFERENCE 
has not been specified for the argument, the string is passed 
with the length. 
VALUE is the default if the C or STDCALL property 
is specified in the subprogram definition. 
For more details, see 
information on mixed-language programming in the HP Fortran for OpenVMS User Manual.
   - REFERENCE32 
 Specifies that the argument is accepted only by 32-bit address.
   - REFERENCE64 
 Specifies that the argument is accepted only by 64-bit address.
   - VARYING 
Allows a variable number of calling arguments. If VARYING is specified, 
the C property must also be specified. 
Either the first argument 
must be a number indicating how many arguments to process, or the last 
argument must be a special marker (such as --1) indicating it is the 
final argument. The sequence of the arguments, and types and kinds must 
be compatible with the called procedure.
 
Options C, STDCALL, REFERENCE, VALUE, and VARYING affect the calling 
conventions of routines:
  - You can specify C, STDCALL, REFERENCE, and VARYING for an entire 
  routine.
  
 -  You can specify VALUE and REFERENCE for individual arguments.
 
For More Information:
  - On syntax rules for all general directives, see Section 14.1.
  
 - On using the cDEC$ ATTRIBUTES directive, see the HP Fortran for OpenVMS User Manual.
 
  
    
      Note 
         
        
        1  The following form is also allowed: 
        !MS$ATTRIBUTES att [,att]... :: object [,object]...
    
     | 
  
14.4   DECLARE or NODECLARE Directives   
The DECLARE directive generates warnings for variables that have been 
used but have not been declared (like the IMPLICIT NONE statement). The 
NODECLARE directive (the default) disables these warnings.
The DECLARE and NODECLARE directives take the following forms: 
1
  
    
       
      
- cDEC$ DECLARE
 - cDEC$ NODECLARE
  
     | 
  
c
Is one of the following: C (or c), !, or * (see Section 14.1).
The DECLARE directive is primarily a debugging tool that locates 
variables that have not been properly initialized, or that have been 
defined but never used.
For More Information:
  
    
      Note 
         
        
        1  The following forms are also 
        allowed: !MS$DECLARE and !MS$NODECLARE.
    
     |