「作業」コードの一部をコンパイルしているときに、より不明瞭なこのメッセージが表示されることもあります。
IBM2622I W ENTRY used to set the initial value in a DO loop will
be invoked after any TO or BY values are set.
新しいコンパイラーは、次のようなコードに対してこのメッセージを生成します。
dcl jx fixed bin;
dcl last fixed bin init(10);
do jx = f() to last;
put skip list( jx );
end;
f: proc returns( fixed bin );
last = 4;
return( 2 );
end;
このコードでは、ループ内で初期値を設定する関数 f は、ループ内の最終値を設定する変数 last の値も変更することに注意してください。 このメッセージは、ループの最終値を設定する変数 last を既にコンパイラーが使用した後で、この変数への変更が行われていることを警告しています。 この例の項を具体的に見てみると、ループは 2 から 4 ではなく、2 から 10 で実行されます。
これは、従来のコンパイラーがこのようなコードに対して行ったことと異なります。従来のコンパイラーでは、このループは 2 から 4 で実行されるはずです。
したがって、このコードを従来のコンパイラーの下で動作したのと同じように動作させるには、ソース・コードを変更する必要があります。 呼び出しルーチン内で他の変数を変更するような副次作用を持つ関数があるのは、良いプログラミング実践ではないため、いずれにせよ、ソース・コードの変更は得策です。 また、上記のコードはあまり透過的ではありません。不明瞭な作用を持つ分かりにくいコードは、決して良くありません。