「言語解説書」マニュアルに記述されているように、引数が CONTROLLED ストリング (または領域) である場合は (ALLOCATE ステートメントが長さまたはエクステントを変更した可能性があり、それによりストリングの長さや領域サイズが、呼び出されるルーチンの要求と異なってしまったため)、仮引数が作成されます。
Enterprise PL/I では、RULES(NOLAXCTL) オプションが有効でストリングの長さまたは領域サイズが定数でない限り、これは真です。 しかし、従来のコンパイラーは必ずしもこのルールに一貫して従っていたわけではありません (従来のコンパイラーに RULES(NOLAXCTL) オプションと同等のオプションはなかったので、本来は適用されるべきでしたが)。 新しいコンパイラーでは、このルールを一貫して適用します。
そのため、例えば次のようなコードになります。
dcl x entry( char(8) ); dcl a controlled char(8); dcl 1 b(2) controlled, 2 c char(8); call x( a ); call y( b(1).c );
この例では、両方の CALL ステートメントに対して仮引数が作成されるべき ですが、2 番目の CALL に対しては Enterprise コンパイラーのみが仮引数を作成します。