OberonCore
https://forum.oberoncore.ru/

B39: DevCPB.Promote не проп-т слож-е CHAR-конст. в цепочку
https://forum.oberoncore.ru/viewtopic.php?f=116&t=6162
Страница 1 из 1

Автор:  Евгений Темиргалеев [ Вторник, 14 Ноябрь, 2017 23:22 ]
Заголовок сообщения:  B39: DevCPB.Promote не проп-т слож-е CHAR-конст. в цепочку

Логическая ошибка в 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;

Автор:  Trurl [ Четверг, 16 Ноябрь, 2017 21:19 ]
Заголовок сообщения:  Re: DevCPB.Promote не пропускает сложение CHAR-конст. в цепо

Лечение поможет, но диагноз поставлен неправильно. Promote не устанавливает тип результата операции, а приводит аргументы к нужным типам.

Кстати, в 1.7 сделано очень похоже.

Автор:  Евгений Темиргалеев [ Пятница, 17 Ноябрь, 2017 04:06 ]
Заголовок сообщения:  Re: DevCPB.Promote не пропускает сложение CHAR-конст. в цепо

Да, спасибо, Вы правы... сложение цепочек у меня было в фокусе внимания.
--
https://redmine.blackboxframework.org/issues/40
Код:
            ELSIF ((f = Char16) OR (g = Char16)) & (op # plus) THEN new := DevCPT.char16typ
Это решение мне тоже напрашивалось первым делом.

Автор:  Евгений Темиргалеев [ Пятница, 17 Ноябрь, 2017 23:51 ]
Заголовок сообщения:  Re: DevCPB.Promote не пропускает сложение CHAR-конст. в цепо

Поставлю правку Центра, чтобы было одинаково.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/