Логическая ошибка в Promote: если один из аргументов типа Char16, то результат операции выдаётся Char16 без учёта типа операции — для отношений это верно, а для сложения — нет.
Код:
MODULE Mod;
IMPORT Log;
PROCEDURE Do;
BEGIN
Log.String(21X + 20X);
Log.String(LONG(21X) + 20X); (* ошибка *)
Log.String(LONG(21X) + LONG(20X)); (* ошибка *)
Log.String("А" + "Б"); (* ошибка *)
Log.String("…" + "…"); (* ошибка *)
Log.String(2026X + 2026X); (* ошибка *)
END Do;
BEGIN
Do
END Mod.
Исправление:
Код:
ELSIF f IN charSet + {String8, String16} THEN
IF g IN charSet + {String8, String16} THEN
IF (f = String16) OR (g = String16) OR (f = Char16) & (g = String8) OR (f = String8) & (g = Char16) THEN
new := DevCPT.string16typ
>>>> вставить ELSIF op = plus THEN
IF (f = Char16) OR (g = Char16) THEN new := DevCPT.string16typ
ELSE new := DevCPT.string8typ
END<<<<
ELSIF (f = Char16) OR (g = Char16) THEN new := DevCPT.char16typ
ELSIF (f = String8) OR (g = String8) THEN new := DevCPT.string8typ
>>>> вырезать ELSIF op = plus THEN
IF (f = Char16) OR (g = Char16) THEN new := DevCPT.string16typ
ELSE new := DevCPT.string8typ
END<<<<
END;