このメッセージは、コンパイラーが、常に通過しなければならないステートメントが 制御のフローとして実行されないと検出したことを警告する。
引数の数は、ENTRY 宣言のパラメーターの数と一致 しなければならない。
完全なステートメントを構成する可能性がある PL/I キーワードが、 ステートメント・ラベルとして使用されている。 この使用法は許容されるが、セミコロンを使用すべき場所で コロンが使用されている可能性がある。
dcl a fixed bin(31) ext; if a = 0 then put skip list( ’a = 0’ ) else: a = a + 1;
示されているキーワード文節内の式はスカラーでなければな らないが、配列参照が指定されている。
dcl p pointer; dcl x based char(10); dcl a(10) area(1000); allocate x in(a) set(p);
構造体が予期されている場合にスカラーを引数として渡すことが可能だが、このためには「ダミー」構造体を作成し、スカラーをその構造の各フィールドに割り当てる必要がある。
dcl e entry( 1 2 fixed bin(31), 2 fixed bin(31) ); dcl i fixed bin(15); call e( i );
GOTO ステートメントは DO ループ内部にジャンプすることはできず、 (異なる) DO ループ内のラベル定数をターゲットとする GOTO に対しては、 コンパイラーによってフラグが立てられる。 ただし、DO ループ内のラベルがラベル変数に割り当てられている場合、 この種のエラーは検出されない可能性がある。
RULES(NOLAXMARGINS) のもとでは、右マージンの後ろにはブランク 以外の何も指定してはならない。
示されている変数は、初期化される前に使用された可能性がある。
示されている組み込み関数は拡張浮動小数点の引数を持っているが、 対応する拡張ルーチンがまだ使用可能でないため、適切な長精度ルーチンを 使用して評価される。
HUGE(1s0) より大きな値を短精度浮動小数点に割り当てることはできない。 16 進表示では、値 3.141592E+40 を短精度浮動小数点に割り当てることが可能 だが、IEEE のもとで短精度浮動小数点が保持できる最大値は約 3.40281E+38 である。
浮動リテラルの精度は、その仮数内の桁数により暗黙に決 まる。 例えば、1e99 は暗黙に FLOAT DECIMAL(1) を表すが、 値 1e99 は FLOAT DECIMAL(1) が保持できる最大値より大きい。
TO の値が、FIXED 変数または PICTURE 変数の保持できる最大値 と等しい場合、その変数が上位になるループは、LEAVE または GOTO によって ループを終了しないかぎり、無限に実行される。 例えば、以下に示す 1 つ目のコード・フラグメントでは、 x が 99 より大きな値になることはあり得ず、ループは無限になる。 以下に示す 2 つ目のコード・フラグメントでは、 y が 32767 より大きな値になることはあり得ず、ループは無限になる。
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;
式には、ロケーター修飾子用の定数値と共に、基底付き変数 への参照が含まれている。 これにより、一部のシステムでは記憶保護例外が発生することがある。 また、変数が NULL または SYSNULL に基づくものとして宣言 されていて、その定数値がロケーター修飾子として使用されていること を示している場合もある。
dcl a fixed bin(31) based( null() ); a = 0;
特別の場合を除き、FIXED BIN 宣言の中の精度は、 SIGNED の場合は 7、15、31、または 63 でなければならず、 UNSIGNED の場合はこれらの各値より 1 大きい値でなければならない。 このメッセージは、例えば、宣言に UNSIGNED FIXED BIN(8) を 指定するつもりで FIXED BIN(8) を指定した可能性があることを示す。
スイッチを設定しテストするようにコードを変更するか、 または GOTO を最適化の必要がないほど小さいモジュールに制限す る必要がある。
PLIXOPT ストリングは解析できなかった。 詳細については、示されている LE メッセージを参照のこと。
PLIXOPT ストリングに無効な項目がある。 詳細については、示されている LE メッセージを参照のこと。
PLIXOPT ストリングに、LE ではサポートされない ランタイム・オプションが含まれている。 詳細については、示されている LE メッセージを参照のこと。
SPIE オプションおよび STAE オプションは、TRAP オプションに置き換えられてい る。 TRAP(ON) は、SPIE および STAE に相当し、TRAP(OFF) は NOSPIE および NOSTAE に相当 する。 SPIE と NOSTAE の組み合わせおよび NOSPIE と STAE の組み合わせは、サポートされなくなった。 詳細については、示されている LE メッセージを参照のこと。
一般に、配列を受け取ることになっている場合にスカラーを 渡すべきではないが、スカラーを渡したい場合もある。
dcl a entry( (*) fixed bin ) option(nodescriptor); call a( 0 );
コンマの次に、有効な構文エレメント (ID など) でなく、 セミコロンがある。 コンマは無視され、セミコロンが有効になる。
dcl 1 a, 2 b fixed bin, 2 c fixed bin, ;
RULES(IBM) のもとでは、FIXED BIN のオペランドと、 非ゼロのスケール因数を指定した FIXED DEC のオペランドが 比較演算または算術演算に使用される場合、FIXED DEC オペランド は FIXED BIN に変換される。 RULES(ANS) のもとでは、FIXED BIN のオペランドと、ゼロのスケール因数を 指定した FIXED DEC のオペランドが比較演算または算術演算に使用される場合、 FIXED DEC オペランドは FIXED BIN に変換される。 どちらの場合も、有効数字が失われる可能性があり、また小数部分がある場合は、 小数部分が 2 進数として正確に表現されない可能性がある。 例えば、RULES(IBM) のもとでは、以下の代入ステートメント によってターゲットの値は 29.19 になり、また比較演算の中で C は FIXED BIN(31,10) に変換されて、有効数字が失われる (実際には SIZE が 発生するが、SIZE は使用不可になっているため、このプログラムは エラーになる)。
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;
BEGIN ステートメントの OPTIONS 文節に指定した属性 (下記の 例では REDUCIBLE) は、BEGIN ブロックには無効である。
begin options( reducible );
PROCEDURE ステートメントの OPTIONS 文節に指定した 属性 (下記の例では DATAONLY) は、PROCEDURE には無効である。
a: proc options( dataonly );
指示された属性は PROCEDURE ステートメントでは有効だが、 BEGIN ステートメントでは無効である。
begin recursive;
このコンパイラー・オプションは、このプラットフォームではサポートされていない。
*process map;
このコンパイラー・オプションのサブオプションは、このプラットフォームではサポートされていない。
*process list(4);
多くのコンパイラー・オプションには、サブフィールドのサイズ に制限がある。 特定のコンパイラー・オプションの制限については、「プログラミング・ガイド」を参照のこと。
*process margini( ’+-’ );
DECLARE、 DEFAULT、 IF、 ELSE、 DO、 END、 SELECT、 WHEN、 または OTHERWISE ステートメントでは、条件接頭語は使用できない。
(nofofl): if (x+y) > 0 then
ENTRY ステートメントの OPTIONS 文節に指定した属性 (下記の 例では DATAONLY) は、ENTRY ステートメントでは無効である。
a: entry options( dataonly );
OR、NOT、QUOTE、または NAMES コンパイラー・オプションに指定し た文字は、PL/I 文字セットまたは別のコンパイラー・オプションで既に 定義されている。
*process not(’=’); *process not(’!’) or(’!’);
複素数の実数部と虚数部を異なるフォーマットで表示するには、 REAL 組み込み関数および IMAG 組み込み関数と、2 つのフォーマット項目を 使用する。
put edit ( x ) ( c( e(10,6), e(10,6) ) );
テキストを 2 行に分割する。
%include x; %include y;
CHECK 接頭部は SAA PL/I 言語の一部ではない。
(check): i = j + 1;
CHECK および PENDING 条件は、SAA PL/I 言語の一部ではな い。
on check ...
示されているステートメント (例えば CHECK ステートメント) は、 SAA PL/I 言語の一部ではない。
比較の中の両方のオペランドが定数であるため、比較の 結果も定数である。 例えば、この比較が IF 文節内の式の場合、これは、 THEN 文節と ELSE 文節のどちらか一方は実行されないことを意味する。
配列の場合、INITIAL リストには、その配列が持つエレメントの数 を超える数の値を入れてはならない。
dcl a init( 1, 2 ), b(5) init( (10) 0 );
コメントが、開始ファイルとは別のファイルの中で終わっている。 これは、コメント終了ステートメントが欠落している可能性を示す。
ストリングが、それが始まったファイルとは別のファイルの中で終わっている。 これは、右引用符が欠落している可能性を示す。
すべての ID と定数の間には、 区切り文字 (例えばブランクまたはコンマ) が必要である。
dcl 1 a, 2 b, 3c;
DO ループ内の制御変数が配列、構造体、または共用体の メンバーであるため、このループ用に生成されるコードは最適には ならない。
1 つの END ステートメントを使用して複数のステートメント ・グループをクローズすることは許されるが、コーディング・エラー が示される場合がある。
指示された文字が欠落しているが、ソースの中にはそれ以外の文字がない。 構文解析プログラムが、欠落した文字を挿入してソースを訂正した。
示されている文字が欠落していたため、構文解析プログラムがその 文字を挿入してソースを訂正した。
display( ’Program starting’ ;
一部の ENVIRONMENT オプション (RECSIZE など) には、 サブオプションが必要である。
dcl f file env( recsize );
一部の ENVIRONMENT オプション (CONSECUTIVE など) は、 サブオプションを付けずに指定する必要がある。
dcl f file env( consecutive(1) );
ENVIRONMENT オプションは繰り返し指定してはならない。
dcl f file env( consecutive consecutive );
サブオプションの型が無効である。
dcl f file env( regional(5) );
サポートされる ENVIRONMENT オプションには、この オプションはない。
dcl f file env( unknown );
示されているオプションは、LANGLVL(OS) でのみ 有効である。
dcl f file env( fb );
ソース・プログラムの中に、EXEC SQL ステートメント または EXEC CICS ステートメントがある。 コンパイラーでは、これらのステートメントは無視される。
exec sql ...;
外部名の最大長は、LIMITS コンパイラー・オプション の EXTNAME サブオプションにより設定される。
dcl this_name_is_long static external pointer;
EXPORTS 文節の EXTERNAL 属性に指定した名前は、 PROCEDURE ステートメントの EXTERNAL 属性に指定した名前を オーバーライドする。
a: package exports( b ext(’_B’) ); b: proc ext( ’BB’ );
RESERVES 文節の EXTERNAL 属性に指定した名前は、 DECLARE ステートメントの EXTERNAL 属性に指定した名前 をオーバーライドする。
a: package reserves( b ext(’_B’) ); dcl b ext( ’BB’ ) static ...
FORMAT CONSTANT 配列のエレメントが定義されていない。例えば 、下の例では f(2) がこれに該当する。
f(1): format( x(2), a ); f(3): format( x(4), a );
示されている変数ではステートメント・ラベル配列が 定義されているが、その配列のエレメントの一部に、収容プロシージャー のステートメント用のラベルではないものがある。
l(1): display( ... ); l(3): display( ... );
論理演算子の 1 つ (OR、AND、または NOT) に対する引数 が定数である。 演算の結果も定数になる可能性がある。 例えば、この演算が IF 文節内の式の場合、これは、 THEN 文節と ELSE 文節のどちらか一方は実行されないことを意味する。
if a | ’1’b then
CALL ステートメントの中で、関数 (例えば、RETURNS 属性を 持つ PROCEDURE または ENTRY ステートメント) が呼び出された。 この関数から戻される値は廃棄される。これが有効なことを示すに は、OPTIONAL 属性を指定する必要がある。
示されている属性は、GENERIC 記述リストでは無効である。
dcl g generic ( f1 when( connected ), f2 otherwise );
配列の初期化は不完全になる。 名前付き変数が構造体の一部である場合、この問題が生じた構造体の後続のエレメントは、メッセージ 2602 でフラグを立てられる。 これは、おそらくプログラミング・エラー (下記の例では、4 で なく 6 がおそらく正しい) であり、このプログラムを実行すると例外 が発生する可能性がある。
dcl a(8) fixed dec init( 1, 2, (4) 0 );
%CONTROL ステートメントのあとには、 括弧で囲んだ FORMAT オプションまたは NOFORMAT オプションと、 セミコロンを指定しなければならない。
%OPTION ステートメントの中の LANGLVL オプション は、LANGLVL(SAA) または LANGLVL(SAA2) として指定しなけ ればならない。
%NOPRINT ステートメントのあとには (間にブランクを入れるか入れないかは任意で) セミコロン を指定しなければならない。
%PAGE ステートメントのあとには (間にブランクを入れるか入れないかは 任意で) セミコロンを指定しなければならない。
%PRINT ステートメントのあとには (間にブランクを入れるか入れないか は任意で) セミコロンを指定しなければならない。
999 を超えるスキップ量はサポートされていない。
%skip(2000);
%SKIP ステートメントのあとには括弧で囲んだ整数、 および (間にブランクを入れるか入れないかは任意で) セミコロンを指定しなければならない。
%OPTION ステートメント内の TEST オプションは、 サブオプションを付けずに指定しなければならない。
%OPTION ステートメント内の NOTEST オプションは、 サブオプションを付けずに指定しなければならない。
%PUSH ステートメントのあとには (間にブランクを入れるか入れないかは 任意で) セミコロンを指定しなければならない。
%POP ステートメントのあとには (間にブランクを入れるか入れないか は任意で) セミコロンを指定しなければならない。
%NOTE ステートメントのあとには、注および任意の戻りコードを括弧で囲んで指定し、 その次にセミコロンを指定しなければならない。
FIXED BIN の最大精度は LIMITS オプションにより決まる。
FIXED DEC の最大精度は LIMITS により決まる。
FLOAT BIN の最大精度は、Intel では 64、AIX では 106、z/OS では 109 である。
FLOAT DEC の最大精度は、Intel では 18、AIX では 32、z/OS では 33 である。ただし、DFP では最大 34 である。
I/O ステートメントで参照されている集合のメンバーの 一部が非計算型である。 計算型メンバーは正しく処理されるが、非計算型メンバーは無視さ れる。
dcl 1 x, 2 y ptr, 3 fixed bin(31); put skip list(x);
SYSTEM(CICS)、SYSTEM(TSO)、および SYSTEM(IMS) のもとでは、 MAIN プロシージャーに対する引数はすべて、POINTER 型で なければならない。
このメッセージは、%NOTE ステートメントで 戻りコード 4 と共に使用される。
コンパイラー・オプションの指定に、右引用符または 右括弧が欠落している。 引用符付きストリングは行の境界を超えてはならない。
無効なコンパイラー・オプションを指定した。
入力ソース・レコードでは、印刷制御文字はサポートされな い。
コンパイラー・オプションのサブオプションが無効である。 このサブオプションは、不明なものか、または許容範囲外のもので ある。
*process flag(q) margins(1002);
コンパイラー・オプションの必須サブオプションが欠落して いる。
*process or;
コンパイラー・オプションの必須サブオプションがいくつか 欠落している。
*process margins;
該当のオプション (例えば REORDER) は、 OPTIONS 属性の外部で受け入れられるが、OPTIONS 属性の内部に 指定する必要がある。 こうすることによって、ANSI 規格にも準拠することになる。
サポートされる LINKAGE オプションは、OPTLINK と SYSTEM だけである。
サポートされる LINKAGE オプションは、OPTLINK と SYSTEM だけである。
保留 %PUSH ステートメントの最大数は 63 である。
保留中の %PUSH ステートメントがないときに、%POP が発行された。
このメッセージは、引数が 1 つだけ指定されて いる場合に、FIXED および FLOAT 組み込み関数に適用される。 精度はデフォルトに設定されずに、その引数から得られる。 例えば、x が FLOAT BIN(21) の場合、FIXED(x) からは 値 FIXED BIN(21) が戻される。
OPTIONS リスト内の示されているエレメントはサポートされていない。
dcl a ext entry options( nomap );
WHEN 文節または OTHERWISE 文節は SELECT ステートメントに必須ではないが、 指定しないとコーディング・エラーが示されることがある。
ユーザー指定ストリングの長さが 0 である。 これが起こるのは、コマンド行に OR(’’) または OR(’A’) を指定した場合である。 後者の場合、単一の ’A’ 文字はエスケープ文字として解釈される。
SELECT ステートメントには WHEN 文節は必須ではないが、 指定しないとコーディング・エラーが示されることがある。
FROM 文節または INTO 文節に指定された参照のバイト整合が とれていない可能性がある。 参照のバイト整合がとれていない場合は、予測不能な結果が生じる ことがある。
FIXED BINARY 定数の最大精度は、LIMITS コンパイラー・ オプションの FIXEDBIN サブオプションで指定する。
FIXED DECIMAL 定数の最大精度は、LIMITS コンパイラー・ オプションの FIXEDDEC サブオプションで指定する。
浮動 2 進定数は、Intel では 64 桁、AIX では 32 桁、z/OS では 33 桁に制限されている。
浮動 10 進定数は、Intel では 18 桁、AIX では 106 桁、z/OS では 109 桁に制限されている。
浮動リテラルの精度は、その仮数の桁数により暗黙に決まる。 例えば、1e99 は暗黙に FLOAT DECIMAL(1) を表すが、 値 1e99 は FLOAT DECIMAL(1) が保持できる最大値より大きい。
このメッセージは ADDR、CURRENTSTORAGE/SIZE、 および STORAGE/SIZE 組み込み関数に適用される。これらの組み込み関数のいずれかをバイト整合のとれていない 変数に適用すると、予想どおりの結果が生成されないことがある。
以下のコードの断片では、WHILE 文節は I=5 という最後の DO 指定にのみ適用する。
do i = 1, 3, 5 while( j < 5 );
プロシージャーの中に、再帰呼び出しの原因となるコードが 含まれているが、このプロシージャーは RECURSIVE 属性を指定して 宣言されていない。
a: proc( n ); ... if n > 0 then call a;
SIGNAL ステートメントが発生させる条件が使用不可に されている場合は、その SIGNAL ステートメントは無視される。 SIZE など、一部の条件はデフォルトで使用不可にされる。
(nofofl): signal fixedoverflow;
INITIAL 文節内のストリング (下記の例では ’TooBig’) は、 ターゲットに合うように切り詰められる (例では ’TooB’ になる)。
dcl x char(4) static init(’tooBig’);
RETURNS 文節内のストリング (下記の例では ’TooBig’) は、 ターゲットに合うように切り詰められる (例では ’TooB’ になる)。
x: proc returns( char(4) ); ... return( ’TooBig’ );
割り当てに指定したソース (下記の例では ’TooBig’) は、 ターゲット変数に合うように切り詰められる (例では ’TooB’ になる)。
dcl x char(4); x = ’TooBig’;
エントリー呼び出し内のソース (下記の例では ’TooBig’) は、 パラメーターに合うように切り詰められる (例では ’TooB’ になる)。
dcl x entry( char(4) ); call x( ’TooBig’ );
2 つのストリングを連結した結果のストリングの長さは、 派生ストリング型の最大許容長を超えてはならない。
プロシージャーについて NODESCRIPTOR が指定されて いる (または暗黙に選択されている) 場合は、集合パラメーター に CONNECTED 属性が必要である。 CONNECTED 属性は、明示的にコーディングすることも、 DEFAULT(CONNECTED) コンパイラー・オプションにより暗黙に指定する こともできる。
示されているオプションは、LANGLVL コンパイラー・オプションに指定されている PL/I 言語定義の一部ではない。
31 > p1 の場合に、値 FIXED BIN(p1,0) を 値 FIXED BIN(p2,0) で除算すると、結果の属性は FIXED BIN(p1,0) になる。 ANSI 76 では、この属性は FIXED BIN(31,31-p1) になる。
制御下の SELECT ステートメントでは、WHEN 文節に前 の WHEN 文節と同じ値がある場合、2 番目の WHEN 文節のコードは 実行されない。 このメッセージが生成されるのは、その SELECT ステートメントが その他の点ではブランチ・テーブルへの変換に適している場合だけである。
プロシージャーまたは開始ブロックに、MAXSTMT オプションに 指定された数より多くのステートメントが含まれている場合、 最適化は制限される。 この問題を回避するには、ブロックをより管理しやすい部分に分割する。
SYSTEM(CICS) および SYSTEM(IMS) のもとで使用する場合を 除き、MAIN プロシージャーの引数は最大 1 つでなければならない。
SYSTEM(CICS)、SYSTEM(TSO)、および SYSTEM(IMS) のもとで使用する場合 を除き、MAIN プロシージャーに対する引数 は CHARACTER VARYING でなければならない。
AREA 変数用に指定した INITIAL 属性はすべて無視される。 この変数は、代わりに EMPTY 組み込み関数を使用して初期化される。
すべてのファイル条件はファイル参照を使用して修飾 しなければならない。ただし、ENDFILE および ENDPAGE は、 ファイル参照なしで受け入れられる。 この場合、SYSIN および SYSPRINT がそれぞれ想定される。
ENTRY 参照が、そのエントリーを呼び出した結果を使用する と考えられる状況で、使用されている。
dcl e1 entry returns( ptr ); dcl q ptr based; e1->q = null(); dcl e2 entry returns( bit(1) ); if e2 then ...
%LINE ディレクティブのあとには、(間にブランクを入れるか入れないかは任意で) 括弧、行番号、 コンマ、ファイル名、および右括弧を指定しなければならない。
%line( 19, test.pli );
DATE 組み込み関数は 2 桁の年を戻す。 4 桁の年を戻す DATETIME 組み込み関数を使用する方がよい。
LANGLVL コンパイラー・オプションのサブオプションに 矛盾がある。 SAA2 サブオプションと OS サブオプションは同時に使用することはできない。
*process langlvl(saa2 os);
%OPTION ステートメントでサポートされるオプション は LANGLVL オプションだけである。
引数を何も渡さないように、PLITEST の呼び出しを変更する必要が ある。
LABEL 変数は、ブロック活動化情報を必要とするため、 コンパイル時には初期化できない。 INITIAL 属性付きの STATIC LABEL 変数の場合、その変数が構造体 または共用体のメンバーであれば、重大メッセージが発行される。 それ以外の場合は、ブロック活動化情報が必要であるという要件 を取り除くために、属性が INTERNAL CONSTANT に変更される。 このような変数は、収容ブロックから LABEL CONSTANT を使用して 初期化する必要がある。
NAMES オプションの 2 つの引数を指定する場合は、それら の引数の長さが同じでなければならない。 2 番目の引数は、最初の引数の英大文字値である。 最初のストリングの文字に英大文字値がない場合は、その文字自体 を英大文字値として使用する。 例えば、次のようになる。
names( ’$!@’ ’$!@’)
書式が x & y、x | y、または x ^ y の式では、x と y はどちらも BIT 型でなければならない。
オペランドが数値型の場合は、結果は、その値が ストリングに変換されたあとでとる長さになる。 数値型の長さは、ストレージ要件と同じではない。
配列の初期化は不完全になる。 名前付き変数が構造体の一部である場合、この問題が生じた構造体の後続のエレメントは、メッセージ 2603 でフラグを立てられる。 アスタリスクは、すべてのエレメントを 1 つの値を用いて初期化するた めの初期化因数として使用できる。 次の例では、a(1) は値 13 を用いて初期化されるが、 エレメント a(2) から a(8) は初期化されない。 これに対して、b の中のすべてのエレメントは 13 に初期化される。
dcl a(8) fixed bin init( 13 ); dcl b(8) fixed bin init( (*) 13 );
OS/2 プラットフォームでは ISAM はシミュレートされないの で、ファイルは VSAM KSDS に似た方法で処理される。 次に示す例では、最初の宣言に指定されているファイルは、 2 番目の宣言の中のファイルと同じ方法で処理される。 つまり、両方とも ORGANIZATION(INDEXED) として処理される。
dcl f1 file env(indexed); dcl f2 file env(organization(indexed));
フォーマットの幅が出力には小さすぎる。 このフォーマットは、入力用に使用されている場合は有効なときがある。
割り当てに指定したソース (下記の例では ’TooBig’) は、 ターゲット変数に合うように切り詰められる (例では ’TooB’ になる)。 ターゲットが疑似変数の場合は、代わりにメッセージ 1186 が発行される。
dcl x char(4); x = ’TooBig’;
GET ステートメントに指定する場合は、A フォーマット項目に 幅を指定する必要がある。
get edit(name) (a);
示されているプロシージャーは、外部プロシージャーではな く、コンパイル単位内で参照されることはない。 これはエラー (このプロシージャーを呼び出すことにな っている場合) またはなんらかの非活動コードを除去する機会 を示す。
BYADDR をエントリーに渡した引数が、エントリー記述の 対応するパラメーターに一致しない。 その引数のアドレスはエントリーに渡されない。 代わりに、引数が、エントリー記述内のパラメーターに一致する 属性を持つ一時変数に割り当てられ、その一時変数の アドレスがエントリーに渡される。 これは、エントリーがこのパラメーターの値を変更した場合、 呼び出しルーチンはその変更を認識できないということを意味している。
dcl e entry( fixed bin(31) ); dcl i fixed bin(15); call e( i );
デフォルトの属性が与えられるが、宣言にエラーがある場合 もある。 例えば次の例では、括弧が欠落している可能性がある。
dcl a, b fixed bin;
デフォルトの属性が与えられるが、宣言にエラーがある場合 もある。 例えば次の例では、c および d のレベル番号はおそらく 3 が 正しい。
dcl a, b fixed bin; 1 a, 2 b, 2 c, 2 d;
デフォルトの属性が与えられるが、宣言にエラーがある場合 もある。 例えば次の例では、c および d のレベル番号はおそらく 3 が 正しい。
dcl a, b fixed bin; 1 a, 2 *, 2 c, 2 d;
このメッセージが出ないようにするには、CHAR 組み込み 関数または BIT 組み込み関数を最初の引数に適用する必要がある。
dcl i fixed bin; display( substr(i,4) );
LEAVE ステートメントにラベルが指定されている場合は、 このメッセージは生成されない。 次のループでは、LEAVE ステートメントは直接囲んで いる DO グループを終了するだけで、ループは終了されない。
do i = 1 to n; if a(i) > 0 then do; call f; leave; end; else; end;
このメッセージは、変数がとる可能性のある 最大値または最小値に等しい定数と、その変数を比較する場合に 生成される。 次のループでは、変数 x は 99 を超えることはできない。したがって、 このループにより毎回実行される暗黙の比較では、結果は常に ’1’b になる。
do x pic’99’; do x = 1 to 99; end;
このメッセージは、MAXTEMP コンパイラー・オプションで 許容されるバイト数を超えるバイト数をステートメントが一時的に使用し た場合に生成される。
2 桁の年フィールドを含むデータが関係する比較では、 年の 1 つだけが 1999 年よりあとの年だった場合に、問題が起こること がある。
比較では、片方の被比較数の属性が DATE であれば、もう一方も 同じ属性でなければならない。 日付でない方が日付パターンとして有効な値を持つ リテラルであれば、日付の被比較数と同じ DATE 属性を持つものと見なされる。 したがって、次のコードでは、’670101’ は DATE(’YYMMDD’) 属性が指定されている場合と同様に解釈される。
dcl x char(6) date(’YYMMDD’); if x > ’670101’ then ...
比較では、片方の被比較数の属性が DATE であれば、もう一方も 同じ属性でなければならない。 日付でない方が日付パターンとして無効な値を持つ リテラルであれば、DATE 属性は無視される。 したがって、次のコードでは、x に DATE 属性がないものとして 比較が評価される。
dcl x char(6) date(’YYMMDD’); if x > ’’ then ...
明示割り当てまたは暗黙割り当てのターゲットの属性 が DATE であれば、ソースも同じ属性でなければならない。 そうでない場合は、DATE 属性は無視される。 したがって、次のコードでは、x に DATE 属性がないものとして 割り当てが実行される。
dcl x char(6) date(’YYMMDD’); x = ’’;
STDOUT を参照して、コンパイラー・バックエンドによって発行されたメッセージを調べること。
示されている文字が欠落していたため、構文解析プログラムがその 文字を挿入してソースを訂正した。
xx: dcl test fixed bin;
配列の初期化は不完全になる。 名前付き変数が構造体の一部である場合、この問題が生じた構造体の最初のエレメントは、メッセージ 1138 でフラグを立てられる。 これは、おそらくプログラミング・エラー (下記の例では、6 で なく 7 がおそらく正しい) であり、このプログラムを実行すると例外 が発生する可能性がある。
dcl 1 a, 2 b(8) fixed bin init( 1, (7) 29 ), 2 c(8) fixed bin init( 1, (6) 29 );
配列の初期化は不完全になる。 名前付き変数が構造体の一部である場合、この問題が生じた構造体の最初のエレメントは、メッセージ 1208 でフラグを立てられる。 アスタリスクは、すべてのエレメントを 1 つの値を用いて初期化するた めの初期化因数として使用できる。 次の例では、b(1) および c(1) は値 13 で初期化されるが、エレメント b(2) から b(8)、および c(2) から c(8) は未初期化である。 これに対して、d の中のすべてのエレメントは 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 );
FIXED DECIMAL への変換のソースが、異なる精度とスケール因数を持つ FIXED DECIMAL または PICTURE 変数である場合、および精度の違いがスケール因数 の違いほど大きくない場合、有効数字が失われることがある。 SIZE 条件が使用可能になっていれば、そのような状況の発生を検出するためのコードが生成され、 このメッセージは出されない。
dcl a fixed dec(04) init(1009); dcl b fixed dec(03); b = a;
指定された行に、無効な ANS 印刷制御文字が含まれている。 有効な文字は、ブランク、0、-、+、および 1 である。
FIXED DECIMAL への変換のソースが、異なる精度とスケール因数を持つ PICTURE 変数である場合、および精度の違いがスケール因数 の違いほど大きくない場合、有効数字が失われることがある。 SIZE 条件が使用可能になっていれば、そのような状況の発生を検出するためのコードが生成され、 このメッセージは出されない。
dcl a pic’(4)9’ init(1009); dcl b fixed dec(03); b = a;
PICTURE への変換のソースが、異なる精度とスケール因数を持つ PICTURE 変数である場合、および精度の違いがスケール因数 の違いほど大きくない場合、有効数字が失われることがある。 SIZE 条件が使用可能になっていれば、そのような状況の発生を検出するためのコードが生成され、 このメッセージは出されない。
dcl a pic’(4)9’ init(1009); dcl b pic’(3)9’; b = a;
コメントにセミコロンが含まれている場合、以下の例のように、意図的ではないが閉じていないコメント があり、一部のソースが誤ってコメント化されてしまうことを示していることがある。
/* start of unclosed comment dcl b pic’(3)9’; /* next comment */
このメッセージは、MULTIPLY、DIVIDE、ADD、および SUBTRACT の組み込み関数に適用される。 これらの関数の 1 つに対する 1 つの引数が FIXED DEC であり、もう 1 つの引数が FIXED BIN であると、指定された精度が FIXED DEC 精度として解釈されない。 これによって、不適切なデータの切り捨てが起こる可能性がある。 例えば、以下の乗算の結果は、属性 FIXED DEC(15) ではなく、属性 FIXED BIN(15) を持つことになり、結果が不適切に切り捨てられる原因となることがある。
dcl a fixed bin(31); dcl b fixed dec(15); b = multiply( a, 1000, 15 );
制御下の SELECT ステートメントでは、WHEN 文節に前 の WHEN 文節と同じ値がある場合、2 番目の WHEN 文節のコードは 実行されない。 このメッセージが生成されるのは、その SELECT ステートメントが その他の点ではブランチ・テーブルへの変換に適している場合だけである。
制御下の SELECT ステートメントでは、WHEN 文節に前 の WHEN 文節と同じ値がある場合、2 番目の WHEN 文節のコードは 実行されない。 このメッセージが生成されるのは、その SELECT ステートメントが その他の点ではブランチ・テーブルへの変換に適している場合だけである。
示されている変数は、初期化される前に使用された可能性がある。
このメッセージは、例えば "and" または "or" のつもりで "equals" を使っている、以下のようなステートメントにフラグを立てる。
if ( a < b ) = ( c < d ) then
DO ループは通常は反復するが、DO ループの指定が 1 つの割り当てだけで構成されている場合、それは常に 1 度限り実行される。 次の例に示すように、DO の後にセミコロンが欠落している。
do edsaup.tprs = ads162.tprs; edsaup.tops = ads162.tops; end;
SIZE または STG 組み込み関数が CHAR(*) VARYING (または VARYINGZ) パラメーターに適用され、使用可能な記述子がない場合、変数に割り振られる実際のストレージのサイズは判別できず、現行のサイズのみ、戻すことができる。
一般に、ラベルを別のルーチンに渡すことは賢明ではない。 このことを行うコードがあれば、再設計を考える方が良いと思われる。 コンパイラーがこのメッセージを発行するのは、OPTIONS( COBOL ) または OPTIONS( ASM ) または OPTIONS( FORTRAN ) を使って宣言された ENTRY に対して LABEL を渡している場合である。 このようなラベルの使用が妥当なのは、呼び出されたルーチンが、別の PL/I ルーチンにそれを渡すことになる場合だけである。
コンパイラー・オプションのサブオプションのサブオプションが無効である。 このサブオプションは、不明なものか、または許容範囲外のもので ある。
*process limits(extname(2000));
このファイルの %INCLUDE は省略可能と考えられる。
REFER オブジェクトを変更すると、期待どおりの結果が生成されない可能性がある。 例えば次の例で、割り当ては配列 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 = ’’;
通常、ON ERROR ブロックの最初のステートメントは、ON ERROR SYSTEM ステートメントでなければならない。これにより、ON ERROR ブロックの残りのコードにエラーがあったとしても、無限ループが回避されやすくなる。
DO ループの初期値が ENTRY を介して設定されている場合は、その ENTRY が TO または BY 値に変更された場合に、予期しない結果が生じる場合がある。 例えば、次の最初のループにある関数 "first" によって、変数 "last" の値が変更されるべきではない。 このコードを次の 2 番目のループの形に変更する方がよい。
do x = first() to last; end; temp = first(); do x = temp to last; end;
DFP のもとでは FLOAT DEC から FLOAT BIN への変換に、ローパフォーマンスを引き起こす、効率の低いライブラリー呼び出しが必要となる。 これを避けるために、DECIMAL 組み込み関数を FIXED BIN オペランドに適用することができる。 例えば、最初の割り当てステートメントを次の 2 番目の形に変更した方がよい。
dcl n fixed bin(31); dcl f float dec(16); f = n + f; f = dec(n) + f;
DFP のもとでは FLOAT DEC から FLOAT BIN への変換に、ローパフォーマンスを引き起こす、効率の低いライブラリー呼び出しが必要となる。 これを避けるために、DECIMAL 組み込み関数を BIT オペランドに適用することができる。 例えば、最初の割り当てステートメントを次の 2 番目の形に変更した方がよい。
dcl b bit(8); dcl f float dec(16); f = b + f; f = dec(b) + f;
DFP のもとでは FLOAT DEC から FLOAT BIN への変換に、ローパフォーマンスを引き起こす、効率の低いライブラリー呼び出しが必要となる。
SUBSTR 参照の 3 番目の引数をゼロの定数にすることは、技術的には有効であるが、コーディング・エラーを示す可能性がある。
XMI メタデータは、REFER の使用が "simple" である場合に限り、REFER を使用した BASED 構造に対して生成される。
32 バイトより大きい BYVALUE パラメーターは、必要となるオーバーヘッドが大きすぎるため、パフォーマンスが低下する。
名前付き変数に対してデバッグ・シンボル情報は生成されないため、したがって、デバッガーを使用したときに名前付き変数を参照できない。
演算結果のスケール係数が結果の精度を超えた場合は、予期しない FIXEDOVERFLOW 例外が発生する可能性がある。 例えば、この例外は、LIMITS(FIXEDDEC(15)) オプションを指定して 2 つの FIXED DEC(15,8) 変数を乗算した場合に、その乗算の結果の属性が FIXED DEC(15,16) になるため発生する。 このメッセージを除去するには、PRECISION 組み込み関数を使用して、オペランドの 1 つのスケール係数を減らすか、 MULTIPLY 組み込み関数を使用して、結果のデフォルト属性をオーバーライドする。
このメッセージは、 MULTIPLY、 DIVIDE、 ADD、 および SUBTRACT の組み込み関数に適用される。 これらの関数の 1 つに対する 1 つの引数が FIXED DEC であり、もう 1 つの引数が FLOAT BIN であると、指定された精度が FIXED DEC 精度として解釈されない。 これによって、不適切なデータの切り捨てが起こる可能性がある。 例えば、以下の乗算の結果は、属性 FIXED DEC(15) ではなく、属性 FLOAT BIN(15) を持つことになり、結果が不適切に切り捨てられる原因となることがある。
dck a float bin(31); dcl b fixed dec(15); b = multiply( a, 1000, 15 );
このメッセージは、MULTIPLY、DIVIDE、ADD、および SUBTRACT の組み込み関数に適用される。 これらの関数の 1 つに対する 1 つの引数が FIXED DEC であり、もう 1 つの引数が FLOAT DEC であると、指定された精度が FIXED DEC 精度として解釈されない。 これによって、不適切なデータの切り捨てが起こる可能性がある。 例えば、以下の乗算の結果は、属性 FIXED DEC(15) ではなく、属性 FLOAT DEC(15) を持つことになり、結果が不適切に切り捨てられる原因となることがある。
dcl a float dec(15); dcl b fixed dec(15); b = multiply( a, 1000, 15 );
このような変数を使用しているコードは、POINTER または OFFSET 変数のサイズが FIXED BIN 変数のサイズと同じである場合にのみ機能する。
このような変数を使用しているコードは、POINTER または OFFSET 変数のサイズが FIXED BIN 変数のサイズと同じである場合にのみ機能する。