This message warns that the compiler has detected a statement that can never be run as the flow of control must always pass it by.
The number of arguments should match the number of parameters in the ENTRY declaration.
A PL/I keyword which could form a complete statement has been used as statement label. This usage is accepted, but a colon may have been used where a semicolon was intended.
dcl a fixed bin(31) ext; if a = 0 then put skip list( ’a = 0’ ) else: a = a + 1;
The expression in the named keyword clause should be a scalar, but an array reference was specified.
dcl p pointer; dcl x based char(10); dcl a(10) area(1000); allocate x in(a) set(p);
A scalar may be passed as the argument when a structure is expected, but this require building a "dummy" structure and assigning the scalar to each field in that structure.
dcl e entry( 1 2 fixed bin(31), 2 fixed bin(31) ); dcl i fixed bin(15); call e( i );
GOTO statements may not jump into DO loops, and the compiler will flag any GOTO whose target is a label constant inside a (different) DO loop. However, if a label inside a DO loop is assigned to a label variable, then this kind of error may go undetected.
Under RULES(NOLAXMARGINS), there should be nothing but blanks after the right margin.
The indicated variable may be used before it has been initialized.
The indicated built-in function has an extended float argument, but since the corresponding extended routine is not yet available, it will be evaluated using the appropriate long routine.
A value larger than HUGE(1s0) cannot be assigned to a short float. Under hexadecimal float, the value 3.141592E+40 could be assigned to a short float, but under IEEE, the maximum value that a short float can hold is about 3.40281E+38.
The precision for a float literal is implied by the number of digits in its mantissa. For instance 1e99 is implicitly FLOAT DECIMAL(1), but the value 1e99 is larger than the largest value a FLOAT DECIMAL(1) can hold.
If the TO value is equal to the maximum value that a FIXED or PICTURE variable can hold, then a loop dominated by that variable will run endlessly unless exited inside the loop by a LEAVE or GOTO. For example, in the first code fragment below, x can never be bigger than 99, and the loop would be infinite. In the second code fragment below, y can never be bigger than 32767, and the loop would be infinite.
dcl x pic’99’; do x = 1 to 99; put skip list( x ); end; dcl y fixed bin(15); do y = 1 to 32767; put skip list( y ); end;
An expression contains a reference to a based variable with a constant value for its locator qualifier. This may cause a protection exception on some systems. It may also indicate that the variable was declared as based on NULL or SYSNULL and that this constant value is being used as its locator qualifier.
dcl a fixed bin(31) based( null() ); a = 0;
Except in unusual circumstances, the precision in a FIXED BIN declaration should be 7, 15, 31 or 63 if SIGNED and one greater if UNSIGNED. This message may indicate that a declare specified, for example, FIXED BIN(8) when UNSIGNED FIXED BIN(8) was meant.
Try to change the code so that it sets and tests a switch instead, or limit GOTOs to very small modules that do not need optimization.
The PLIXOPT string could not be parsed. See the cited Language Environment message for more detail.
The PLIXOPT string contains an invalid item. See the cited Language Environment message for more detail.
The PLIXOPT string contains a run-time option which is not supported by LE. See the cited Language Environment message for more detail.
The SPIE and STAE options have been replaced by the TRAP option. TRAP(ON) is equivalent to SPIE and STAE; TRAP(OFF) is equivalent to NOSPIE and NOSTAE. The combination SPIE and NOSTAE and the combination NOSPIE and STAE are no longer supported. See the cited Language Environment message for more detail.
Generally, scalars should not be passed where arrays are expected, but in some situations, this may be desired.
dcl a entry( (*) fixed bin ) option(nodescriptor); call a( 0 );
A comma was followed by a semicolon rather than by a valid syntactical element (such as an identifier). The comma will be ignored in order to make the semicolon valid.
dcl 1 a, 2 b fixed bin, 2 c fixed bin, ;
Under RULES(IBM), when a comparison or arithmetic operation has an operand that is FIXED BIN and an operand that is FIXED DEC with a non-zero scale factor, then the FIXED DEC operand will be converted to FIXED BIN. Under RULES(ANS), when a comparison or arithmetic operation has an operand that is FIXED BIN and an operand that is FIXED DEC with a zero scale factor, then the FIXED DEC operand will be converted to FIXED BIN. In each case, significant digits may be lost, and if there is a fractional part, it may not be exactly represented as binary. For instance, under RULES(IBM), the assignment statement below will cause the target to have the value 29.19, and in the comparison, C will be converted to FIXED BIN(31,10) and significant digits will be lost (in fact, SIZE would be raised, but since it is disabled, this program would be in error).
dcl a fixed dec(07,2) init(12.2); dcl b fixed bin(31,0) init(17); dcl c fixed dec(15,3) init(2097151); dcl d fixed bin(31,0) init(0); a = a + b; if c = d then;
An attribute (REDUCIBLE in the example below) has been specified in the OPTIONS clause on a BEGIN statement, but that attribute is not valid for BEGIN blocks.
begin options( reducible );
An attribute (DATAONLY in the example below) has been specified in the OPTIONS clause on a PROCEDURE statement, but that attribute is not valid for PROCEDUREs.
a: proc options( dataonly );
The indicated attribute is valid on PROCEDURE statements, but not on BEGIN statements.
begin recursive;
The compiler option is not supported on this platform.
*process map;
Suboptions of the compiler option are not supported on this platform.
*process list(4);
Various compiler options have limits on the size of subfields. Refer to the :cit.Programming Guide:ecit. for the limits of specific compiler options.
*process margini( ’+-’ );
Condition prefixes are not allowed on DECLARE, DEFAULT, IF, ELSE, DO, END, SELECT, WHEN or OTHERWISE statements.
(nofofl): if (x+y) > 0 then
An attribute (DATAONLY in the example below) has been specified in the OPTIONS clause on an ENTRY statement, but that attribute is not valid for ENTRY statements.
a: entry options( dataonly );
A character specified in the OR, NOT, QUOTE or NAMES compiler option is already defined in the PL/I character set or by another compiler option.
*process not(’=’); *process not(’!’) or(’!’);
If you wish to display the real and imaginary parts of a complex number using different formats, use the REAL and IMAG built-in functions and 2 format items.
put edit ( x ) ( c( e(10,6), e(10,6) ) );
Split the text into 2 lines.
%include x; %include y;
The CHECK prefix is not part of the SAA PL/I language.
(check): i = j + 1;
The CHECK and PENDING conditions are not part of the SAA PL/I language.
on check ...
The named statement, for example the CHECK statement, is not part of the SAA PL/I language.
Both operands in a comparison are constant, and consequently, the result of the comparison is also a constant. If this comparison is the expression in an IF clause, for example, this means that either the THEN or ELSE clause will never be executed.
For an array, an INITIAL list should not contain more values than the array has elements.
dcl a init( 1, 2 ), b(5) init( (10) 0 );
A comment ends in a different file than it begins. This may indicate that an end-of-comment statement is missing.
A string ends in a different file than it begins. This may indicate that a closing quote is missing.
A delimiter (for example, a blank or a comma) is required between all identifiers and constants.
dcl 1 a, 2 b, 3c;
The control variable in the DO loop is a member of an array, a structure or an union, and consequently, the code generated for the loop will not be optimal.
Using one END statement to close more than one group of statements is permitted, but it may indicate a coding error.
The indicated character is missing, and there are no more characters in the source. The missing character has been inserted by the parser in order to correct your source.
The indicated character is missing and has been inserted by the parser in order to correct your source.
display( ’Program starting’ ;
Certain ENVIRONMENT options, such as RECSIZE, require suboptions.
dcl f file env( recsize );
Certain ENVIRONMENT options, such as CONSECUTIVE, should be specified without any suboptions.
dcl f file env( consecutive(1) );
ENVIRONMENT options should not be repeated.
dcl f file env( consecutive consecutive );
The suboption type is incorrect.
dcl f file env( regional(5) );
There is no such supported ENVIRONMENT option.
dcl f file env( unknown );
The indicated option is valid only with LANGLVL(OS).
dcl f file env( fb );
An EXEC SQL or EXEC CICS statement has been found in the source program. The compiler will ignore these statements.
exec sql ...;
The maximum length of external names is set by the EXTNAME suboption of the LIMITS compiler option.
dcl this_name_is_long static external pointer;
The name specified in the EXTERNAL attribute in the EXPORTS clause overrides the name specified in the EXTERNAL attribute on the PROCEDURE statement.
a: package exports( b ext(’_B’) ); b: proc ext( ’BB’ );
The name specified in the EXTERNAL attribute in the RESERVES clause overrides the name specified in the EXTERNAL attribute in the DECLARE statement.
a: package reserves( b ext(’_B’) ); dcl b ext( ’BB’ ) static ...
An element of a FORMAT CONSTANT array has not been defined, for example, f(2) in the example below.
f(1): format( x(2), a ); f(3): format( x(4), a );
The named variable defines a statement label array, but not all the elements in that array are labels for statements in the containing procedure.
l(1): display( ... ); l(3): display( ... );
An argument to one of the logical operators (or, and or not) is a constant. The result of the operation may also be a constant. If this operation is the expression in an IF clause, for example, this means that either the THEN or ELSE clause will never be executed.
if a | ’1’b then
A function, for example, a PROCEDURE or ENTRY statement with the RETURNS attribute, has been invoked in a CALL statement. The value that is returned by the function will be discarded, but the OPTIONAL attribute should be used to indicate that this is valid.
The named attribute is invalid in GENERIC description lists.
dcl g generic ( f1 when( connected ), f2 otherwise );
The array will be incompletely initialized. If the named variable is part of a structure, subsequent elements in that structure with this problem will be flagged with message 2602. This may be a programming error (in the example below, 4 should probably have been 6) and may cause exceptions when the program is run.
dcl a(8) fixed dec init( 1, 2, (4) 0 );
The %CONTROL statement must be followed by FORMAT or NOFORMAT option enclosed in parentheses and then a semicolon.
The LANGLVL option in the %OPTION statement must be specified as either LANGLVL(SAA) or LANGLVL(SAA2).
The %NOPRINT statement must be followed, with optional intervening blanks, by a semicolon.
The %PAGE statement must be followed, with optional intervening blanks, by a semicolon.
The %PRINT statement must be followed, with optional intervening blanks, by a semicolon.
Skip amounts greater than 999 are not supported.
%skip(2000);
The %SKIP statement must be followed by a semicolon with optional intervening blanks and a parenthesized integer.
The TEST option in the %OPTION statement must be specified without any suboptions.
The NOTEST option in the %OPTION statement must be specified without any suboptions.
The %PUSH statement must be followed, with optional intervening blanks, by a semicolon.
The %POP statement must be followed, with optional intervening blanks, by a semicolon.
The %NOTE statement must be followed by, in parentheses, a note and an optional return code, and then a semicolon.
The maximum FIXED BIN precision depends on the LIMITS option.
The maximum FIXED DEC precision depends on the LIMITS option.
The maximum FLOAT BIN precision is 64 on Intel, 106 on AIX and 109 on z/OS.
The maximum FLOAT DEC precision is 18 on Intel, 32 on AIX and 33 on z/OS except for DFP which has a maximum of 34.
Some members of an aggregate referenced in an I/O statement are noncomputational. The computational members will be correctly processed, but the noncomputational ones will be ignored.
dcl 1 x, 2 y ptr, 3 fixed bin(31); put skip list(x);
Under SYSTEM(CICS), SYSTEM(TSO) and SYSTEM(IMS), the arguments to the MAIN procedure should all have type POINTER.
This message is used by %NOTE statements with a return code of 4.
A closing quote or parenthesis is missing in the specification of a compiler option. A quoted string must not cross line boundaries.
An invalid compiler option has been specified.
Printer control characters are not supported on input source records.
A suboption of a compiler option is incorrect. The suboption may be unknown or outside the allowable range.
*process flag(q) margins(1002);
A required suboption of a compiler option is missing.
*process or;
Required suboptions of a compiler option are missing.
*process margins;
The option, for example REORDER, is accepted outside of the OPTIONS attribute, but it should be specified within the OPTIONS attribute. This would also conform to the ANSI standard.
The only supported LINKAGE options are OPTLINK and SYSTEM.
The only supported LINKAGE options are OPTLINK and SYSTEM.
The maximum number of pending %PUSH statements is 63.
A %POP has been issued when no %PUSH statement are pending.
This message applies to the FIXED and FLOAT built-in functions when only one argument is given. The precision is not set to a default, but is instead derived from the argument. For example, if x is FLOAT BIN(21), FIXED(x) will return a FIXED BIN(21) value.
The indicated element of the OPTIONS list is not supported.
dcl a ext entry options( nomap );
WHEN or OTHERWISE clauses are not required on SELECT statements, but their absence may indicate a coding error.
User-specified string has zero length. This can occur when OR(’’) or OR(’Á’) has been specified on the command line. In the latter case, the single ’Á’ character has been interpreted as an escape.
SELECT statements do not require WHEN clauses, but their absence may indicate a coding error.
The reference specified in the FROM or INTO clause may not be byte-aligned. If the reference is indeed not byte-aligned, unpredictable results may occur.
The maximum precision for FIXED BINARY constants is specified by the FIXEDBIN suboption of the LIMITS compiler option.
The maximum precision for FIXED DECIMAL constants is specified by the FIXEDDEC suboption of the LIMITS compiler option.
Float binary constants are limited to 64 digits on Intel, 32 on AIX and 33 on z/OS.
Float decimal constants are limited to 18 digits on Intel, 106 on AIX and 109 on z/OS.
The precision for a float literal is implied by the the number of digits in its mantissa. For instance 1e99 is implicitly FLOAT DECIMAL(1), but the value 1e99 is larger than the largest value a FLOAT DECIMAL(1) can hold.
This message applies to the ADDR, CURRENTSTORAGE/SIZE and STORAGE/SIZE built-in functions. Applying any one of these built-in functions to a variable that is not byte-aligned may not produce the results you expect.
In the following code snippet, the WHILE clause applies only to the last DO specification, that is only when I = 5;
do i = 1, 3, 5 while( j < 5 );
A procedure contains code that will cause it to be recursively invoked, but the procedure was not declared with RECURSIVE attribute.
a: proc( n ); ... if n > 0 then call a;
The SIGNAL statement is ignored if the condition it would raise is disabled. Some conditions, like SIZE, are disabled by default.
(nofofl): signal fixedoverflow;
The string in the INITIAL clause (’TooBig’ in the example below) will be trimmed to fit (to ’TooB’).
dcl x char(4) static init(’tooBig’);
The string in the RETURNS clause (’TooBig’ in the example below) will be trimmed to fit (to ’TooB’).
x: proc returns( char(4) ); ... return( ’TooBig’ );
The source in the assignment (’TooBig’ in the example below) will be trimmed to fit (to ’TooB’).
dcl x char(4); x = ’TooBig’;
The source in the entry invocation (’TooBig’ in the example below) will be trimmed to fit (to ’TooB’).
dcl x entry( char(4) ); call x( ’TooBig’ );
The length of the string produced by concatenating two strings must not be greater than the maximum allowed for the derived string type.
If NODESCRIPTOR is specified (or implied) for a procedure, aggregate parameters should have the CONNECTED attribute. The CONNECTED attribute can be explicitly coded, or it can be implied by the DEFAULT(CONNECTED) compiler option.
The named option is not part of the PL/I language definition as specified in the LANGLVL compiler option.
When dividing a FIXED BIN(p1,0) value by a FIXED BIN(p2,0) value where 31 > p1, the result will have the attributes FIXED BIN(p1,0). With ANSI 76, it would have the attributes FIXED BIN(31,31-p1).
In a dominated SELECT statement, if a WHEN clause has the same value as an earlier WHEN clause, the code for the second WHEN clause will never be executed. This message will be produced only if the SELECT statement is otherwise suitable for transformation into a branch table.
Optimization will be restricted for any procedure or begin-block. that contains more statements than specified in the MAXSTMT option. To avoid this, the block could be split up into more manageable parts.
A MAIN procedure should have at most one argument, except under SYSTEM(CICS) and SYSTEM(IMS).
The argument to the MAIN procedure should be CHARACTER VARYING, except under SYSTEM(CICS), SYSTEM(TSO) and SYSTEM(IMS).
Any INITIAL attribute specified for an AREA variable is ignored. The variable will, instead, be initialized with the EMPTY built-in function.
All file conditions should be qualified with a file reference, but ENDFILE and ENDPAGE are accepted without a file reference. SYSIN and SYSPRINT are then assumed, respectively.
An ENTRY reference is used where the result of invoking that entry is probably meant to be used.
dcl e1 entry returns( ptr ); dcl q ptr based; e1->q = null(); dcl e2 entry returns( bit(1) ); if e2 then ...
The %LINE directive must be followed, with optional intervening blanks, by a parenthesis, a line number, a comma, a file name and a closing parenthesis.
%line( 19, test.pli );
The DATE built-in returns a two-digit year. It might be better to use the DATETIME built-in which returns a four-digit year.
There is a conflict of suboptions for the LANGLVL compiler option. The SAA2 and OS suboptions are mutually exclusive.
*process langlvl(saa2 os);
The only option supported in the %OPTION statement is the LANGLVL option.
Change the invocation of PLITEST so that no argument is passed.
LABEL variables require block activation information, and hence they cannot be initialized at compile-time. For a STATIC LABEL variable with the INITIAL attribute, if the variable is a member of a structure or an union, a severe message will be issued. Otherwise, its attributes will be changed to INTERNAL CONSTANT in order to eliminate the requirement for block activation information. Such a variable must be initialized with LABEL CONSTANTs from containing blocks.
If two arguments of the NAMES option are specified, they must be the same length. The second argument is the uppercase value of the first. If a character in the first string does not have an uppercase value, use the character itself as the uppercase value. For example:
names( ’$!@’ ’$!@’)
In an expression of the form x & y, x | y, or x ^ y, x and y should both have BIT type.
If the operand has a numeric type, the result is the length that value would have after it was converted to string. The length of a numeric type is NOT the same as its storage requirement.
The array will be incompletely initialized. If the named variable is part of a structure, subsequent elements in that structure with this problem will be flagged with message 2603. An asterisk can be used as an initialization factor to initialize all the elements with one value. In the example below, a(1) is initialized with the value 13, while the elements a(2) through a(8) are uninitialized. In contrast, all the elements in b are initialized to 13.
dcl a(8) fixed bin init( 13 ); dcl b(8) fixed bin init( (*) 13 );
Since ISAM is not being simulated on the OS/2 platform, the file will be treated in a manner similar to VSAM KSDS. The file specified in the first declaration below would be handled in the same manner as the file in the second declaration. Both are treated as ORGANIZATION(INDEXED).
dcl f1 file env(indexed); dcl f2 file env(organization(indexed));
The format width is too small for output. It may be valid if the format is being used for input.
The source in the assignment (’TooBig’ in the example below) will be trimmed to fit (to ’TooB’). If the target is a pseudovariable, message 1186 is issued instead.
dcl x char(4); x = ’TooBig’;
A width must be specified on A format items when specified on a GET statement.
get edit(name) (a);
The named procedure is not external and is never referenced in the compilation unit. This may represent an error (if it was supposed to be called) or an opportunity to eliminate some dead code.
An argument passed BYADDR to an entry does not match the corresponding parameter in the entry description. The address of the argument will not be passed to the entry. Instead, the argument will be assigned to a temporary with attributes that do match the parameter in the entry description, and the address of that temporary will be passed to the entry. This means that if the entry alters the value of this parameter, the alteration will not be visible in the calling routine.
dcl e entry( fixed bin(31) ); dcl i fixed bin(15); call e( i );
It will be given the default attributes, but this may be because of an error in the declare. For instance, in the following example, parentheses may be missing
dcl a, b fixed bin;
It will be given the default attributes, but this may be because of an error in the declare. For instance, in the following example, the level number on c and d should probably be 3.
dcl a, b fixed bin; 1 a, 2 b, 2 c, 2 d;
It will be given the default attributes, but this may be because of an error in the declare. For instance, in the following example, the level number on c and d should probably be 3.
dcl a, b fixed bin; 1 a, 2 *, 2 c, 2 d;
To eliminate this message, apply the CHAR or BIT built-in function to the first argument.
dcl i fixed bin; display( substr(i,4) );
This message is not produced if the LEAVE statement specifies a label. In the following loop, the LEAVE statement will cause only the immediately enclosing DO-group to be exited; the loop will not be exited.
do i = 1 to n; if a(i) > 0 then do; call f; leave; end; else; end;
This message is produced when a variable is compared to a constant equal to the largest or smallest value that the variable could assume. In the following loop, the variable x can never be greater than 99, and hence the implied comparison executed each time through the loop will always result in a ’1’b.
do x pic’99’; do x = 1 to 99; end;
This message is produced if a statement uses more bytes for temporaries than allowed by the MAXTEMP compiler option.
Comparisons involving data containing 2-digit year fields may cause problems if exactly one of the years is later than 1999.
In a comparison, if one comparand has the DATE attribute, the other should also. If the non-date is a literal with a value that is valid for the date pattern, it will be viewed as if it had the same DATE attribute as the date comparand. So, in the following code, ’670101’ will be interpreted as if it had the DATE(’YYMMDD’) attribute.
dcl x char(6) date(’YYMMDD’); if x > ’670101’ then ...
In a comparison, if one comparand has the DATE attribute, the other should also. If the non-date is a literal with a value that is not valid for the date pattern, the DATE attribute will be ignored. So, in the following code, the comparison will be evaluated as if x did not have the DATE attribute.
dcl x char(6) date(’YYMMDD’); if x > ’’ then ...
If the target in an explicit or implicit assignment has the DATE attribute, the source should also. If it does not, the DATE attribute will be ignored. So, in the following code, the assignment will be performed as if x did not have the DATE attribute.
dcl x char(6) date(’YYMMDD’); x = ’’;
Look in STDOUT to see the message issued by the compiler backend.
The indicated character is missing and has been inserted by the parser in order to correct your source.
xx: dcl test fixed bin;
The array will be incompletely initialized. If the named variable is part of a structure, the first element in that structure with this problem will be flagged with message 1138. This may be a programming error (in the example below, 6 should probably have been 7) and may cause exceptions when the program is run.
dcl 1 a, 2 b(8) fixed bin init( 1, (7) 29 ), 2 c(8) fixed bin init( 1, (6) 29 );
The array will be incompletely initialized. If the named variable is part of a structure, the first element in that structure with this problem will be flagged with message 1208. An asterisk can be used as an initialization factor to initialize all the elements with one value. In the example below, b(1) and c(1) are initialized with the value 13, while the elements b(2) through b(8) and c(2) through c(8) are uninitialized. In contrast, all the elements in d are initialized to 13.
dcl 1 a, 2 b(8) fixed bin init( 13 ), 2 c(8) fixed bin init( 13 ), 2 d(8) fixed bin init( (*) 13 );
If the source in a conversion to FIXED DECIMAL is a FIXED DECIMAL or PICTURE variable with a different precision and scale factor, and if the difference between the precisions is not as large as the the difference between the scale factors, then significant digits may be lost. If the SIZE condition were enabled, code would be generated to detect any such occurrence, and this message would not be issued.
dcl a fixed dec(04) init(1009); dcl b fixed dec(03); b = a;
The specified line contains an invalid ANS print control character. The valid characters are: blank, 0, -, + and 1.
If the source in a conversion to FIXED DECIMAL is a PICTURE variable with a different precision and scale factor, and if the difference between the precisions is not as large as the the difference between the scale factors, then significant digits may be lost. If the SIZE condition were enabled, code would be generated to detect any such occurrence, and this message would not be issued.
dcl a pic’(4)9’ init(1009); dcl b fixed dec(03); b = a;
If the source in a conversion to a PICTURE is a PICTURE variable with a different precision and scale factor, and if the difference between the precisions is not as large as the the difference between the scale factors, then significant digits may be lost. If the SIZE condition were enabled, code would be generated to detect any such occurrence, and this message would not be issued.
dcl a pic’(4)9’ init(1009); dcl b pic’(3)9’; b = a;
If a comment contains a semicolon, it may indicate that there is an earlier unintentionally unclosed comment that is accidentally commenting out some source as in this example
/* start of unclosed comment dcl b pic’(3)9’; /* next comment */
This message applies to the MULTIPLY, DIVIDE, ADD, and SUBTRACT built-in functions: if one argument to one of these functions is FIXED DEC while the other is FIXED BIN, then the specified precision will not be interpreted as a FIXED DEC precision. This may cause improper truncation of data. For example, the result of the following multiply will have the attributes FIXED BIN(15), not FIXED DEC(15), and that might cause the result to be improperly truncated.
dcl a fixed bin(31); dcl b fixed dec(15); b = multiply( a, 1000, 15 );
In a dominated SELECT statement, if a WHEN clause has the same value as an earlier WHEN clause, the code for the second WHEN clause will never be executed. This message will be produced only if the SELECT statement is otherwise suitable for transformation into a branch table.
In a dominated SELECT statement, if a WHEN clause has the same value as an earlier WHEN clause, the code for the second WHEN clause will never be executed. This message will be produced only if the SELECT statement is otherwise suitable for transformation into a branch table.
The indicated variable may be used before it has been initialized.
This message will flag statements such as the following, where the "equals" is meant to be an "and" or "or".
if ( a < b ) = ( c < d ) then
DO-loops should normally be iterative, but if the DO-loop specification consists of just one assignment, then it will always excute once and only once. A semicolon after the DO may be missing, as in this example
do edsaup.tprs = ads162.tprs; edsaup.tops = ads162.tops; end;
If the SIZE or STG built-in function is applied to a CHAR(*) VARYING (or VARYINGZ) parameter when there is no descriptor available, then the size of the actual storage allocated to the variable cannot be determined and only the current size can be returned.
It is generally very unwise to pass a label to another routine. It would be good to think about redesigning any code doing this. The compiler will issue this message when a LABEL is passed to an ENTRY declared with OPTIONS( COBOL ) or OPTIONS( ASM ) or OPTIONS( FORTRAN ). The only valid use of this label in the called routine would be to pass it on to another PL/I routine.
A suboption of a suboption of a compiler option is incorrect. The suboption may be unknown or outside the allowable range.
*process limits(extname(2000));
It may be possible to omit the %INCLUDE of this file.
Changing REFER objects may not produce the expected results. For example, in the following example, the assignment will not change any of the elements in the array d.
dcl 1 a based(p), 2 b fixed bin(31), 2 c fixed bin(31), 2 d( 10 refer(c) ), 3 e fixed bin(31), 3 f fixed bin(31); a = ’’;
The first statement in an ON ERROR block should usually be an ON ERROR SYSTEM statement. This will tend to prevent an infinite loop if there is an error in the rest of the code in the ON ERROR block.
If the initial value in a DO loop is set via an ENTRY, then you may get unexpected results if that ENTRY also changes the TO or BY value. For example, in the first loop below, the function "first" should not change the value of the variable "last". It would be better to change this code into the form of the second loop below.
do x = first() to last; end; temp = first(); do x = temp to last; end;
Under DFP, the conversion of FLOAT DEC to FLOAT BIN requires an expensive library call that will lead to poor performance. To avoid this, the DECIMAL built-in function can be applied to the FIXED BIN operand. For example, it would be better to change the first assignment statement into the form of the second below.
dcl n fixed bin(31); dcl f float dec(16); f = n + f; f = dec(n) + f;
Under DFP, the conversion of FLOAT DEC to FLOAT BIN requires an expensive library call that will lead to poor performance. To avoid this, the DECIMAL built-in function can be applied to the BIT operand. For example, it would be better to change the first assignment statement into the form of the second below.
dcl b bit(8); dcl f float dec(16); f = b + f; f = dec(b) + f;
Under DFP, the conversion of FLOAT DEC to FLOAT BIN requires an expensive library call that will lead to poor performance.
While technically valid, a SUBSTR reference with a third argument that is a constant of zero probably represents a coding error.
XMI metadata is generated for BASED structures using REFER only if their use of REFER is "simple".
BYVALUE parameters larger than 32 bytes require too much overhead and are bad for performance.
No debug symbol information will be generated for the named variable, and hence it cannot be referenced when using the debugger.
If the scale factor for the result of an operation exceeds the precision of the result, then unexpected fixedoverflow exceptions may occur. This can happen, for example, when multiplying two FIXED DEC(15,8) variables under the LIMITS(FIXEDDEC(15)) option because the result of such a multiplication would have the attributes FIXED DEC(15,16). To eliminate this message, the PRECISION built-in function could be used to reduce the scale factor of one of the operands or the MULTIPLY built-in function could be used to override the default attributes for the result.
This message applies to the MULTIPLY, DIVIDE, ADD, and SUBTRACT built-in functions: if one argument to one of these functions is FIXED DEC while the other is FLOAT BIN, then the specified precision will not be interpreted as a FIXED DEC precision. This may cause improper truncation of data. For example, the result of the following multiply will have the attributes FLOAT BIN(15), not FIXED DEC(15), and that might cause the result to be improperly truncated.
dck a float bin(31); dcl b fixed dec(15); b = multiply( a, 1000, 15 );
This message applies to the MULTIPLY, DIVIDE, ADD, and SUBTRACT built-in functions: if one argument to one of these functions is FIXED DEC while the other is FLOAT DEC, then the specified precision will not be interpreted as a FIXED DEC precision. This may cause improper truncation of data. For example, the result of the following multiply will have the attributes FLOAT DEC(15), not FIXED DEC(15), and that might cause the result to be improperly truncated.
dcl a float dec(15); dcl b fixed dec(15); b = multiply( a, 1000, 15 );
Code using such variables will work only as long as the size of the POINTER or OFFSET variable remains the same as the size of the FIXED BIN variable.
Code using such variables will work only as long as the size of the POINTER or OFFSET variable remains the same as the size of the FIXED BIN variable.