An attribute is an identifier that directs the VSI Pascal compiler to change its behavior in some way. When an attribute is not explicitly stated, the compiler follows the default rules to assign properties to program elements. However, using attributes to override the defaults allows additional control over the properties of data items, routines, and compilation units. Syntax of a VSI Pascal attribute: [ {identifier1 [[ ( { constant-expression | identifier2 } ,...) ]] },... ] The 'identifier1' is the name of the attribute. The 'constant-expression' is a compile-time integer expression that qualifies several of the VSI Pascal attributes. The 'identifier2' is the name of an option available in one of the following cases: o With the CHECK, OPTIMIZE, or KEY attributes o With COMMON and PSECT attributes, indicating the name of a storage area o With the GLOBAL, EXTERNAL, WEAK_GLOBAL, and WEAK_EXTERNAL attributes, indicating an external name A list of attributes can appear anywhere in the VAR, TYPE, and CONST declaration sections, and anywhere in a program that a type, a type identifier, or the heading of a routine or compilation unit is legal. However, only one attribute from a particular class can appear in a given attribute list. The names of attributes, when used in a suitable context, cannot conflict with other identifiers with the same name in the program. Syntactically, an attribute list can appear before a VAR, TYPE, and CONST section in the declaration section. In this case, the attributes would apply to all elements in that particular section. However, at this time, VSI Pascal only allows you to use the HIDDEN attribute in this way. Some attributes require a special form of constant expression called a name string. The syntax of a name string differs from that of other strings in VSI Pascal only in that a name string cannot use the extended-string syntax. See the "HP Pascal Language Reference Manual" for the complete description of attributes.
1 – ALIGN
The ALIGN attribute controls the default alignment rules in a compilation unit or for a TYPE or VAR declaration section. The ALIGN attribute takes a single keyword parameter that has the same name and meaning as the keywords for the /ALIGN qualifier. Note that specifying the ALIGN attribute overrides any value you previously specified with the /ALIGN qualifier. Syntax: [ALIGN(keyword)] You can specify the following keywords: Value Action Default Information ----- ------ ------- ----------- NATURAL Uses natural alignment when Default on OpenVMS Alpha positioning record fields and OpenVMS I64 systems. or array components. Natural alignment is when a record field or an array component is positioned on a boundary based on its size. For example, 32-bit integers are aligned on the nearest 32-bit boundary. VAX Uses byte alignment when pos- Default on OpenVMS VAX itioning record fields or array systems. components. Record fields or array components larger than 32 bits are positioned on the nearest byte boundary. On OpenVMS VAX systems, when you specify a value of NATURAL, automatic variables are aligned on longword boundaries instead of quadword boundaries. This occurs because the largest allowable alignment for the stack is longword alignment.
2 – Alignment
Alignment attributes indicate whether the object should be aligned on a specific address boundary in memory.
2.1 – ALIGNED
The ALIGNED attribute indicates the object is to be aligned on a specific memory boundary. Syntax: ALIGNED [[( n )]] The default alignment of an object depends on its size. The constant expression n must denote an integer. If you omit n, the default is 0, indicating byte alignment. An aligned object is aligned on the memory boundary indicated by n. The constant expression n indicates that the address of the object must end in at least n zeros. ALIGNED(0) specifies byte alignment, ALIGNED(1) specifies word alignment, ALIGNED(2) specifies longword alignment, ALIGNED(3) specifies quadword alignment, ALIGNED(4) specifies octaword alignment, ALIGNED(9), specifies 512-byte alignment, and ALIGNED(13) specifies 8192-byte alignment. See the "HP Pascal Language Reference Manual" for the complete description of using the ALIGNED attribute.
2.2 – UNALIGNED
The UNALIGNED attribute specifies that an object can be aligned on any bit boundary. An UNALIGNED variable cannot have an allocation size greater than 32 bits. See the "HP Pascal Language Reference Manual" for the complete description of using the UNALIGNED attribute.
3 – Allocation
Allocation attributes indicate the form of storage that the object should occupy.
3.1 – AUTOMATIC
The AUTOMATIC attribute specifies that storage for the variable be allocated each time the program enters the routine in which the variable is declared. The storage is deallocated each time the program exits from that routine. An automatic variable exists as long as the declaring routine remains active. See the "HP Pascal Language Reference Manual" for the complete description of using the AUTOMATIC attribute.
3.2 – AT
The AT attribute specifies that VSI Pascal allocates no storage for the object (storage has already been allocated) and that it resides at the exact, specfied address. Syntax: AT( n ) The exact address is specified by the constant expression n. Variables representing machine-dependent entities are frequently given the AT attribute. See the "HP Pascal Language Reference Manual" for the complete description of using the AT attribute.
3.3 – COMMON
The COMMON attribute specifies that storage for a variable be allocated in an overlaid program section called a common block. Syntax: COMMON [[(identifier)]] The 'identifier' indicates the name of the common block. It is passed in uppercase on OpenVMS systems. If you omit the identifier, the name of the variable is used as the name of the common block. This attribute allows you to share variables with other HP languages, such as FORTRAN. See the "HP Pascal Language Reference Manual" for the complete description of using the COMMON attribute.
3.4 – PSECT
The PSECT attribute is useful for placing static variables and executable blocks in program sections that will be shared among executable images. Syntax: [PSECT(identifier)] The 'identifier' designates the program section in which storage for a variable, routine, or compilation is to be allocated. It is passed in uppercase on OpenVMS systems. If you omit the identifier, the name of the variable is used as the name of the common block. The identifier designates the compilation unit in which storage for a variable is to be allocated.
3.5 – STATIC
The STATIC attribute causes VSI Pascal to create a static object, which is allocated only once and which exists as long as the executable image in which it is allocated remains active. See the "HP Pascal Language Reference Manual" for the complete description of using the STATIC attribute.
4 – ASYNCHRONOUS
The ASYNCHRONOUS attribute indicates that a routine may be called by an asynchronous event (such as a condition handler). Since such an event can alter the values of variables within the routine upredictably, this attribute forces the routine to reference only local variables or variables declared with the VOLATILE attribute. See the "HP Pascal Language Reference Manual" for the complete description of using the ASYNCHRONOUS attribute.
5 – CHECK
The CHECK attribute specifies error-checking options that are to be enabled during program execution. Syntax: CHECK [[( {identifier},... )]] An identifier specifies an option to be enabled. If you omit the list of options, all available positive options are enabled. ALL Enables all forms of checking. NONE Suppresses all checking code. [NO]BOUNDS Verifies that an index expression is within the bounds of an array's index type and that character-string sizes are compatible with the operations being performed and that schema types are compatible. [NO]CASE_SELECTORS Verifies that the value of a case selector is contained in the corresponding case label list. [NO]DECLARATIONS Verifies that schema definitions yield valid types and that uses of GOTO from one block to an enclosing block are correct. [NO]OVERFLOW Verifies that the result of an integer computation does not exceed the machine representation. [NO]POINTERS Verifies that the value of a pointer variable is not NIL. [NO]SUBRANGE Verifies that values assigned to variables of subrange types are within the subrange; verifies that a set expression is assignment compatible with a set variable. See the "HP Pascal Language Reference Manual" for the complete description of using the CHECK attribute.
6 – ENUMERATION_SIZE
The ENUMERATION_SIZE attribute controls the allocation of unpacked enumerated data types and Boolean data types, which are considered to be an enumerated type containing two elements. Note that specifying this attribute overrides any value that you previously specified with the /ENUMERATION_SIZE qualifier. Syntax: [ENUMERATION_SIZE(keyword)] You can specify the following keywords: Keyword Action Default Information ------- ---------------------------- ------------------- BYTE Allocates unpacked enumerated Default on OpenVMS VAX types with fewer than 255 systems. elements in a 8-bit byte. Otherwise, the enumerated types are allocated in a 16-bit word. LONG Allocates unpacked enumerated Default on OpenVMS Alpha types in a 32-bit longword. and OpenVMS I64 systems.
7 – ENVIRONMENT
The ENVIRONMENT attribute can be applied to compilation units and causes the unit's program or module level declarations and definitions to be saved. Syntax: ENVIRONMENT [[( name-string )]] If the 'name string' is omitted, the name of the source file is used as the environment file name with the default file type PEN. The declarations and definitions made at the outermost level of the compilation unit (provided they do not have the AUTOMATIC or HIDDEN attribute) are saved in a newly created environment file. If the name string is specified, you must include a legal file specification. See the "HP Pascal Language Reference Manual" for the complete description of using the ENVIRONMENT attribute.
8 – FLOAT
The FLOAT attribute indicates the type of precision to use for objects of type REAL and DOUBLE. Syntax: [FLOAT(keyword)] You can specify the following float types for keywords: o D_FLOAT - REAL=FLOATING, DOUBLE=D_FLOATING o G_FLOAT - REAL=F_FLOATING, DOUBLE=G_FLOATING o IEEE_FLOAT - REAL=S_FLOATING, DOUBLE=T_FLOATING The [FLOAT] attribute is only valid on compilation-units.
9 – HIDDEN
The HIDDEN attribute prevents information concerning a constant definition or a type, variable, procedure, or function declaration from being included in a generated environment file. The HIDDEN attribute can be used only on objects at the outermost level of the compilation unit. It is possible to prevent all declarations within a declaration section from being included in the environment file by preceding the reserved word CONST, TYPE, or VAR with the HIDDEN attribute.
10 – IDENT
The IDENT attribute can be used to qualify the name of a compilation unit. In the absence of an IDENT attribute, the string '01' is supplied to the linker. Syntax: IDENT( name-string ) The 'name-string' can contain additional information whose use is implementation specific. The VSI Pascal compiler uses this string to supply identification information to the linker.
11 – INHERIT
The INHERIT attribute indicates the environment file or files to be inherited by a compilation unit. The environment files specified by the INHERIT attribute must already have been created in compilation units (by either the ENVIRONMENT attribute or a compilation switch). Syntax: INHERIT( {name-string},... ) The compilation unit inherits one or more environment files named by the file specifications in the name strings. The default file type for an inherited environment file is .PEN.
12 – INITIALIZE
The INITIALIZE attribute can be applied to procedures to indicate that the procedure is to be called before the main program is entered. A compilation unit might include any number of INITIALIZE procedures, all of which are called in an unspecified order before the main program is entered. See the "HP Pascal Language Reference Manual" for the complete description of using the INITIALIZE attribute.
13 – KEY
The KEY attribute can be applied to record fields to indicate that the field is to be used as a key field when the record is part of an indexed file. Syntax: KEY [[( n [[, {options},... ]] )]] KEY [[( {options},... )]] The 'n' represents the key number. A key number of 0 indicates that the field is the primary key of the record. All other key numbers indicate alternate keys. The key number must be a constant expression that denotes an integer value in the range from 0 through 254. See the "HP Pascal Language Reference Manual" for the complete description of using the KEY attribute.
13.1 – Options
You can specify certain characteristics of the record key by listing the desired options on the KEY attribute. With these options, you can control the order of the collating sequence and you can allow changes or duplicates on a key. See the "HP Pascal Language Reference Manual" for the complete description of using these options.
13.1.1 – ASCENDING
This option, along with DESCENDING, allows you to specify the collating sequence for the key field. By default, the primary key and alternate key are ASCENDING. When creating a new file, Pascal will create the key with the collating order specified. When opening an existing file, the Run-Time Library will verify that the existing key matches the collating order specified. If neither ASCENDING or DESCENDING is specified when opening an existing file, both types will be accepted.
13.1.2 – CHANGES
This option allows you to specify that changes can be performed on the key. The default for the primary key is NOCHANGES and the default for alternate keys is CHANGES. You can override the CHANGES on alternate keys with NOCHANGES. It is illegal to specify CHANGES on the primary key. When opening an existing file, the Pascal Run-Time Library ignores this option.
13.1.3 – DESCENDING(see ASCENDING)
13.1.4 – DUPLICATES
This option allows you to specify that duplicates of the key are allowed. The default for the primary key is NODUPLICATES and the default for alternate keys is DUPLICATES. When opening an existing file, the Pascal Run-Time Library ignores this option.
14 – LIST
The LIST attribute can be applied to a formal parameter of a routine and indicates that the routine can be called with multiple actual parameters that correspond to the last formal parameter named in the routine heading. You can also use the ARGUMENT and ARGUMENT_LIST_LENGTH predeclared routines when writing procedures and functions that use the LIST attribute. See the "HP Pascal Language Reference Manual" for the complete description of using the LIST attribute.
15 – Optimize
The optimization attributes indicate whether the VSI Pascal compiler should optimize code.
15.1 – OPTIMIZE
The OPTIMIZE attribute specifies optimization options that are to be enabled during compilation of a compilation unit or routine. Syntax: OPTIMIZE [[( {identifier},... )]] All options are enabled by default. ALL Enables all OPTIMIZE options. NONE Disables all OPTIMIZE options. [NO]INLINE Enables inline expansion of user-defined routines. See the "HP Pascal Language Reference Manual" for the complete description of using the OPTIMIZE attribute.
15.2 – NOOPTIMIZE
The NOOPTIMIZE attribute prohibits the compiler from optimizing code for the compilation unit or routine. The NOOPTIMIZE attribute guarantees left-to-right evaluation order with full evaluation of both operands of the AND and OR Boolean operators to aid in diagnosing all potential programming errors. If you wish to have short circuit evaluation even with the NOOPTIMIZE attribute, then use the AND_THEN and OR_ELSE Boolean operators. See the "HP Pascal Language Reference Manual" for the complete description of using the NOOPTIMIZE attribute.
16 – Parameter
The parameter passing attributes indicate the passing mechanism to be used for a parameter.
16.1 – CLASS_A
The CLASS_A attribute causes a formal parameter to be passed by an array descriptor that describes contiguous arrays of atomic data types or contiguous arrays of fixed-length strings. This is the default mechanism for conformant array parameters on OpenVMS VAX systems. This attribute is illegal on parameters of schema types. See the "HP Pascal Language Reference Manual" for the complete description of using the CLASS_A attribute.
16.2 – CLASS_NCA
The CLASS_NCA attribute causes a formal parameter to be passed by a noncontiguous array descriptor. This attribute is illegal on parameters of schema types. This is the default mechanism for conformant array parameters on OpenVMS Alpha and OpenVMS I64 systems.
16.3 – CLASS_S
The CLASS_S attribute causes a formal parameter to be passed by a single descriptor form that is used for scalar data and fixed-length strings. This attribute allows routines written in VSI Pascal to accept actual parameters from languages that generate CLASS_S descriptors. See the "HP Pascal Language Reference Manual" for the complete description of using the CLASS_S attribute.
16.4 – IMMEDIATE
The IMMEDIATE attribute causes a formal parameter value in a routine declaration to be passed by immediate value. See the "HP Pascal Language Reference Manual" for the complete description of using the IMMEDIATE attribute.
16.5 – REFERENCE
The REFERENCE attribute causes the formal parameter in a routine to be passed by reference using foreign parameters. See the "HP Pascal Language Reference Manual" for the complete description of using the REFERENCE attribute.
17 – PEN_CHECKING_STYLE
The PEN_CHECKING_STYLE attribute selects the desired compile-time and link-time checking to perform when the generate environment file is inherited. PEN_CHECKING_STYLE( option ) COMPILATION_TIME Uses the compilation time of the environment file in all subsequent compile-time and link-time checking for users of this environment file. This is the default. IDENT_STRING Uses the [IDENT()] string of the environment file in all subsequent compile-time and link-time checking for users of this environment file. NONE Disables all compile-time and link-time checking for users of this environment file.
18 – POS
POS forces the field (of a packed or unpacked record) to a specific bit position within the record. Syntax: POS( n ) The constant expression 'n' specifies the bit location, relative to the beginning of the record, at which the field begins. See the "HP Pascal Language Reference Manual" for the complete description of using the POS attribute.
19 – READONLY
The READONLY attribute specifies that an object can be read by a program, but cannot have values assigned to it. See the "HP Pascal Language Reference Manual" for the complete description of using the READONLY attribute.
20 – Size
Size attributes indicate the amount of storage to be reserved for the object.
20.1 – BIT
The BIT attribute specifies the amount of storage in bits to be received by the object. Syntax: BIT [[( n )]] The optional constant 'n' indicates the number of bit storage units. It must denote a positive integer. If you omit n, the default value is 1. See the "HP Pascal Language Reference Manual" for the complete description of using the BIT attribute.
20.2 – BYTE
The BYTE attribute specifies the amount of storage in bytes to be received by the object. Syntax: BYTE [[( n )]] The optional constant 'n' indicates the number of byte storage units. It must denote a positive integer. If you omit 'n', the default value is 1. See the "HP Pascal Language Reference Manual" for the complete description of using the BYTE attribute.
20.3 – WORD
The WORD attribute specifies the amount of storage in words to be received by the object. Syntax: WORD [[( n )]] The optional constant 'n' indicates the number of word storage units. It must denote a positive integer. If you omit n, the default value is 1. See the "HP Pascal Language Reference Manual" for the complete description of using the WORD attribute.
20.4 – LONG
The LONG attribute specifies the amount of storage in longwords to be received by the object. Syntax: LONG [[( n )]] The optional constant 'n' indicates the number of longword storage units. It must denote a positive integer. If you omit 'n', the default value is 1. See the "HP Pascal Language Reference Manual" for the complete description of using the LONG attribute.
20.5 – QUAD
The QUAD attribute specifies the amount of storage in quadwords to be received by the object. Syntax: QUAD [[( n )]] The optional constant 'n' indicates the number of quadword storage units. It must denote a positive integer. If you omit 'n', the default value is 1. See the "HP Pascal Language Reference Manual" for the complete description of using the QUAD attribute.
20.6 – OCTA
The OCTA attribute specifies the amount of storage in octawords to be received by the object. Syntax: OCTA [[( n )]] The optional constant 'n' indicates the number of octaword storage units. It must denote a positive integer. If you omit 'n', the default value is 1. See the "HP Pascal Language Reference Manual" for the complete description of using the OCTA attribute.
21 – TRUNCATE
The TRUNCATE attribute indicates that an actual parameter list for a routine can be truncated at the point that the attribute was specified. This attribute can be specified on a formal parameter in a routine declaration, and can be used with the PRESENT function. See the "HP Pascal Language Reference Manual" for the complete description of using the TRUNCATE attribute.
22 – UNBOUND
The UNBOUND attribute specifies that a routine does not access automatic variables outside the scope in which it is declared. That is, the bound procedure value of an unbound routine does not include the static scope pointer. This attribute can be applied to routines and formal routine parameters. See the "HP Pascal Language Reference Manual" for the complete description of using the UNBOUND attribute.
23 – UNSAFE
The UNSAFE attribute indicates that an object can accept values of any type without type checking. The exact properties of an unsafe object depend on the object's machine representation. See the "HP Pascal Language Reference Manual" for the complete description of using the UNSAFE attribute.
24 – VALUE
The VALUE attribute causes the variable to be a reference to an external constant or to be the defining point of a global constant. See the "HP Pascal Language Reference Manual" for the complete description of using the VALUE attribute.
25 – Visibility
The visibility attributes indicate the ability of an object to be shared by compilation units.
25.1 – LOCAL
The LOCAL attribute indicates that an object is unavailable to other independently compiled units. By default, all variables and routines are local. See the "HP Pascal Language Reference Manual" for the complete description of using the LOCAL attribute.
25.2 – GLOBAL
The GLOBAL attribute provides a strong definition of a variable or routine so that other independently compiled units can refer to it. Syntax: [GLOBAL] or, [GLOBAL(idenifier)] or, [GLOBAL('string-literal')] The 'identifier' is the name of the identifier passed to the linker. It is passed in uppercase on OpenVMS systems. If you omit the identifier, the name of the variable is used. The 'string-literal' is a specified string literal that is passed unmodified to the linker. See the "HP Pascal Language Reference Manual" for the complete description of using the GLOBAL attribute.
25.3 – EXTERNAL
The EXTERNAL attribute indicates a variable or routine that is assumed to be global in another independently compiled unit. Syntax: [EXTERNAL] or, [EXTERNAL(identifer)] or, [EXTERNAL('string-literal')] The 'identifer' is the name of the identifier passed to the linker. It is passed in uppercase on OpenVMS systems. If you omit the identifier, the name of the variable is used. The 'string-literal' passes a specified string-literal to the linker unmodified.
25.4 – WEAK_EXTERNAL
The WEAK_EXTERNAL attribute specifies that a variable or routine is not critical to the linking operation. To resolve a weak reference, the linker searches only the named input modules. You can specify an identifier with this attribute to indicate the name by which the corresponding object is known to the linker. Syntax: [WEAK_EXTERNAL] or, [WEAK_EXTERNAL(identifier)] or, [WEAK_EXTERNAL('string-literal')] The 'identifier' is the name of the identifier passed to the linker. If you omit the identifier, the name of the variable is used. The 'string-literal' is the name of the string literal that is passed to the linker unmodified. Compilation units cannot have the EXTERNAL or WEAK_EXTERNAL attribute.
25.5 – WEAK_GLOBAL
The WEAK_GLOBAL attribute specifies that an object is linked only when it is specifically included in the linking operation. To resolve a weak reference, the linker searches only the named input modules. You can specify an identifier to indicate the name by which the corresponding object is known to the linker. Syntax: [WEAK_GLOBAL] or, [WEAK_GLOBAL(identifier)] or, [WEAK_GLOBAL('string_literal')] The 'identifier' is the name of the identifier passed to the linker. If you omit the identifier, the name of the variable is used. The 'string-literal' passes a specified string literal to the linker unmodified. See the "HP Pascal Language Reference Manual" for the complete description of using the WEAK_GLOBAL attribute.
26 – VOLATILE
The VOLATILE attribute indicates to the compiler that the value of an object is subject to change at unusual points in program execution. Normally, during execution, an object's value generally changes only when another value is assigned to it, when it is passed as a writeable VAR parameter, when it is read into by a READ, READLN, or READV procedure, or when it is used as the control variable of a FOR loop. In addition, the compiler expects to evaluate the object only when it appears in an expression. The value of a volatile object may change as the result of an action not directly specified in the program. Thus, the compiler assumes that the value of a volatile object can be changed or evaluated at any time during program execution. Consequently, a volatile object does not participate in any optimization based on assumptions about its value. The behavior of many device registers, and modifications by asynchronous processes and exception handlers, are two examples that demonstrate volatile behavior. See the "HP Pascal Language Reference Manual" for the complete description of using the VOLATILE attribute.
27 – WRITEONLY
The WRITEONLY attribute specifies that an object can have values assigned to it but cannot be read by a program. See the "HP Pascal Language Reference Manual" for the complete description of using the WRITEONLY attribute.