The reference in TYPE(reference) cannot:
For example, the following declarations are invalid:
DECLARE MYFILE FILE STREAM OUTPUT PRINT;
DECLARE ZZZ TYPE( P -> Q ); /* INVALID -
POINTER-QUALIFIED */
DECLARE URFILE TYPE( MYFILE ); /* INVALID - MYFILE IS
CONSTANT */
DECLARE XXX TYPE( AAA(8) ); /* INVALID - HAS
SUBSCRIPT LIST */
DECLARE YYY TYPE( FUN( ) ); /* INVALID -
HAS ARGUMENT LIST */
The type definition cannot have the TYPE attribute, nor can it be any of the following:
For example, the following declarations are invalid:
EXPROC: PROCEDURE( XYZ );
DECLARE XYZ FIXED BIN(15),
AAA TYPE( XYZ );/* INVALID - XYZ IS A PARAMETER */
DECLARE INT FIXED BIN(15),
B TYPE(INT),
Y TYPE(B); /* INVALID - B IS TYPED */
DECLARE 1 STRUCA,
2 PROG TYPE (INT),
2 NAMES CHAR(80);
STRUCT1 TYPE(STRUCA),
STRUCT2 TYPE(STRUCT1.NAMES); /* INVALID - NAMES IS
IN TYPED STRUCTURE */
The reference in TYPE(reference) must not directly or indirectly refer to the variable that is declared, because then a circular definition will be created.
For example, the following declarations are invalid:
DECLARE 1 PROG,
2 MOD CHAR(80),
2 INT FIXED BIN(15),
2 STRUCZ TYPE(PROG);/* INVALID - DIRECTLY CIRCULAR */
DECLARE 1 STRUCA,
2 MOD CHAR(80),
2 INT FIXED BIN(15),
2 STRUCA TYPE(STRUCB); /* INVALID - INDIRECTLY
CIRCULAR */
DECLARE 1 STRUCB,
2 MOD CHAR(80),
2 INT CHAR(80),
2 STRUCA TYPE(STRUCA); /*INVALID - INDIRECTLY
CIRCULAR */