同様に、次の宣言について見てみましょう。
DCL
1 S,
2 A CHAR(10),
2 B,
2 C CHAR(3),
2 D CHAR(3);
従来のコンパイラーは、この宣言についてメッセージを出力しません。 しかし新しいコンパイラーは、次のメッセージを出力します。
IBM1216I W The structure member B is declared without any data
attributes. A level number may be incorrect.
このメッセージは、宣言内の考えられるエラー、すなわち C と D はレベル 2 ではなくレベル 3 で宣言されるべきであることを 示しています。しかし上記の宣言の場合、C と D は B と同じ構造 体レベルであるため、B はこれらの親ではなく、B にはデフォルト属 性の FLOAT が割り当てられます。 これは、ほぼ間違いなくユーザーの希望に反する処理であり、こ の新しいメッセージは、この発生する可能性の高い問題への注意を促しています。
コンパイラーは、以下のカスタマー・コードに対してもこのメッセージを出します。
DCL PARDIASE CHAR (20);
DCL 1 INDIASE1 BASED (PTPDIASE),
2 C1CODIA CHAR (1),
2 C1FECDI DEC FIXED (9),
2 C1DIADI CHAR (9),
2 C1ABRDI CHAR (3),
2 C1RESDI;
DCL PTPDIASE POINTER;
PTPDIASE = ADDR (PARDIASE);
. . .
INDIASE1 = '';
このメッセージは、変数 C1RESDI がデータ属性を指定せずに宣言されているという事実に対して フラグを立てるものです。 このため、FLOAT DEC(6) というデフォルト属性を取得することになり、構造体 INDIASE1 が 22 バイトを占めることを意味します。 しかし、この構造体は CHAR(20) フィールドのアドレスが割り当てられているポインター をベースにしているため、INDIASE1 = ’’; という代入は、他の変数が使用している 2 バイトのストレージ をブランクにしてしまいます。 カスタマーのコードでは、これによってライブラリー・ルーチン内で異常終了が発生することになります。 C1RESDI が CHAR(2) として宣言されているか、あるいは少なくとも CHAR(0) として宣言されていれば (しかも、CHAR(0) が PL/I で合法であれば)、問題は発生しません。
そのため、この章で説明している他の多くのメッセージと同様、このメッセージは E レベル・メッセージではありませんが、コードを変更して、コンパイルでこのメッセージ が出ないようにするのが最適な方法です。