Вроде бы нашел в чем проблема с __COPYREC. Проблема выявилась с компиляцией
node^.conval^ := obj^.conval^ из OfrontOPB
Код: "C"
__COPYREC(__GUARDEQP(node->conval, OfrontOPT_ConstDesc), *obj->conval, 24);
означает
Код: "C"
__GUARDEQP(node->conval, OfrontOPT_ConstDesc)=*obj->conval
Здесь нет лишнего разыменования, здесь два разыменования -> и * в каждой из частей оператора присваивания:
Код: "C"
if(__TYPEOF(node->conval)!=OfrontOPT_ConstDesc__typ)__HALT(-6);*(node->conval)=*obj->conval
У операции "->" приоритет выше ,чем у *, поэтому "*obj->conval" означает "*(obj->conval)". Это соответствует обероновскому
node^.conval^ := obj^.conval^ из исходника, где тоже 2 разыменования слева и два справа.
Проблема не в лишних звездочках, а в том, что __HALT(n) это функция с типом значения void. Поэтому в новых макросах
Код: "C"
#define __GUARDEQR(p, dyntyp, typ) *((dyntyp!=typ##__typ)?__HALT(-6):p)
#define __GUARDEQP(p, typ) *((__TYPEOF(p)!=typ##__typ)?__HALT(-6):p)
производится попытка разыменовать void, что и вызывает сообщение об ошибке.
Предлагаю сменить макросы на
Код: "OBERON"
#define __GUARDEQR(p, dyntyp, typ) *((dyntyp!=typ##__typ)?(__HALT(-6),p):p)
#define __GUARDEQP(p, typ) *((__TYPEOF(p)!=typ##__typ)?(__HALT(-6),p):p)
тогда эта проблема должна пропасть. Правда тут есть небольшая избыточность кода, потому что компилятор генерирует лишнее ветвление и разыменование для
p, хотя после HALT это и не имеет смысла. Но это избыточность небольшая.