> -- Comdiv писал(а):
> Нельзя. Компилятор использует лишь простые проверки осмысленности, и закладывать в  большее - это глупость, потому что приведёт к более сложной минимальной реализации. В совокупности с другими схожими требованиями это может осложнить задачу на один-два порядка в зависимости от аппетита. Это уже задача для опционального анализатора. И это то, как .Вы изначально спросили о причине ограничения, а здесь уже сами в качестве причины указали само ограничение. Технически здесь нет никаких сложностей, так как наличие процедуры ничего не упрощает, и здесь как раз дизайн влияет на реализацию.

Я заранее извиняюсь, поскольку не программист по образованию, поэтому могу некорректно употреблять термины. И мы, видимо, не совсем понимаем друг друга. Вот код:
## Код:
```
MODULE TestExt;
IMPORT Log;
TYPE
   pbas=POINTER TO bas;
   bas=EXTENSIBLE RECORD
            a:INTEGER;
            END;
   pras=POINTER TO ras;
   ras=RECORD (bas)
            b:REAL;
            END;
VAR
   c:pbas;
   d:pras;
PROCEDURE Test(VAR x:bas);
BEGIN
   IF x IS ras THEN
                     Log.String('Расширенный тип');
                     Log.Ln;
   ELSE
            Log.String('Базовый тип');
            Log.Ln;
   END;
END Test;
BEGIN
   NEW(c);
   NEW(d);
   Test(c^);
   Test(d^);
END TestExt.
```


Он корректно работает. Мой вопрос такой - почему через процедуру сравнить разыменованный указатель с типом записи можно, а напрямую, в теле модуля, нельзя?