Поддерживаю. Конечно, это обретает смысл в условиях параметров - открытых массивов. В С непонятно, нафига козе баян )

В КП, кстати, я не вижу проблем к этому.

У динамических массивов в их заголовке блока может стоять длина 0, корректно работало (создать нельзя нулевой длины, потом поставить можно - мы делали SetLength для дин. массивов - который многие на этом форуме используют - и там допускается и 0).

С открытыми массивами - тоже почти всё ОК с приёмом нуля (почему почти - скажу дальше).

Вот пример:
## Код:
```
MODULE Krl_devLangArr0;
   IMPORT SYSTEM, StdLog;

   PROCEDURE P (VAR x: ARRAY OF INTEGER);
      VAR i: INTEGER;
   BEGIN
      StdLog.Int(LEN(x));
      i := 0;
      x[i] := 1
   END P;

   PROCEDURE Do*;
      VAR x: ARRAY 1 OF INTEGER;
   BEGIN
      P(SYSTEM.THISARRAY(SYSTEM.ADR(x[0]), 0));
   END Do;
   
END Krl_devLangArr0.
```


Всё корректно. В лог печатается 0, защита границ срабатывает, в окне трэпа виден массив нулевого размера:
Вложение:
Снимок экрана от 2019-04-05 10-16-33.png [ 11.42 КБ | Просмотров: 12040 ]


КосяГ проявляется, если обращаться к массиву по константному индексу:

## Код:
```
PROCEDURE P (VAR x: ARRAY OF INTEGER);
      VAR i: INTEGER;
   BEGIN
      StdLog.Int(LEN(x));
      x[0] := 1
   END P;
```


На x[0] - пропускает почему-то. На x[1] - уже нет, трэпует.
Кто спинным мозгом ассемблер курит, может помозговать.

Вот декодер для
BEGIN x[0] := 1	END P:

Вложение:
Снимок экрана от 2019-04-05 10-21-32.png [ 13.05 КБ | Просмотров: 12041 ]


А вот для BEGIN i := 0; x[i] := 1; END P:

Вложение:
Снимок экрана от 2019-04-05 10-23-37.png [ 18.32 КБ | Просмотров: 12040 ]
