E1012 Constant expression violates subrange bounds - разное поведение в разных версиях

s62
Дата: 27.08.2019 14:56:24
Приветствую.
Вот такой код, в одном из модулей MFPack (MfPack.MfpUtils).
  _MFARGB = record
	rgbBlue: Byte;
	rgbGreen: Byte;
	rgbRed: Byte;
	rgbAlpha: Byte;
  end;
  MFARGB = _MFARGB;

procedure CopyTColorToMFARGB(const cColor: TColor; out argb: MFARGB);
begin
  argb.rgbRed   := (cColor AND $FF);
  argb.rgbGreen := (cColor shr 8) AND $FF;
  argb.rgbBlue  := (cColor shr 16) AND $FF;
  argb.rgbAlpha := (cColor shl 24) AND $FF; //здесь ошибка
end;

На последней строчке при компиляции вылетает
[dcc32 Error] MfPack.MfpUtils.pas(882): E1012 Constant expression violates subrange bounds
Это в Delphi XE3. В Delphi 10.3.1 CE ошибка не возникает. Кто-то знает или есть мысли, почему может быть так?
И что нужно сделать, чтобы в XE3 ошибка не возникала?

TColor в обеих версиях определен одинаково. Флажок в опциях компилятора Range Checking снят и там, и там (Но это, правда, как написано Runtime errors). Опция {R-} тоже есть в модуле. Я так понимаю/предполагаю, что cColor shl 24 видимо выходит за пределы integer, поэтому ошибка. Но почему это не дает ошибку в Delphi 10.3.1 ?
s62
Дата: 27.08.2019 14:59:34
Собственно, я эту функцию не использую, при создании формы вызывается функция
MFStartup(MF_VERSION, MFSTARTUP_LITE);
и всё.
Kazantsev Alexey
Дата: 27.08.2019 15:09:35
s62,

Там ошибка в коде: shl -> shr
s62
Дата: 27.08.2019 15:16:44
Kazantsev Alexey,
да, я уже сам заметил.
Исправил, но теперь в другом месте аналогичная ошибка.
  srd.rgbtRed:= byte(src shl 16);
вот тут.
Интересно всё-таки, почему в новой Delphi компилируется без ошибок.
Kazantsev Alexey
Дата: 27.08.2019 15:20:53
s62
Интересно всё-таки, почему в новой Delphi компилируется без ошибок.

Потому что это не ошибка.
s62
Дата: 27.08.2019 15:24:44
Kazantsev Alexey
s62
Интересно всё-таки, почему в новой Delphi компилируется без ошибок.

Потому что это не ошибка.
Переформулирую вопрос, почему в версии XE3 компиляция не происходит и выдается сообщение об ошибке (привел выше), а в версии 10.3.1 компилируется?
Kazantsev Alexey
Дата: 27.08.2019 15:31:05
s62,

Потому что ситуацию можно трактовать двояко. Более древний компилятор видит, что в результате сдвиговых операций гарантированно получается ноль, и предупреждает об этом (вероятно, считая, что ради нуля нет смысла городить огород). Более свежий компилятор стал более толерантным :), считает, что дебаггер не просто так в поставку входит и им нужно пользоваться
s62
Дата: 27.08.2019 15:42:08
Kazantsev Alexey
s62,

... Более древний компилятор видит, что в результате сдвиговых операций гарантированно получается ноль, и предупреждает об этом (вероятно, считая, что ради нуля нет смысла городить огород). ...
Не совсем так. Он сообщает, что
dcc32
[dcc32 Error] MfPack.MfpUtils.pas(911): E1012 Constant expression violates subrange bounds
Примерно: константное выражение выходит за границы диапазона.
asutp2
Дата: 27.08.2019 16:31:12
s62,

так в чем проблема то? Ну выдает XE3 ошибку, и что дальше? На момент реализации XE3 у разработчиков делфи было одно видение ситуации. К моменту выхода 10.3 видение у разработчиков делфи изменилось. Как писали выше, видение стало более толератным, соответственно компилятор реализовали в более расширенном режиме.

Что делать с этим? А разве непонятно? либо переписать код для совместимости, либо перейти на 10.3
s62
Дата: 27.08.2019 16:33:25
asutp2
Что делать с этим? А разве непонятно? либо переписать код для совместимости, либо перейти на 10.3

Так хочется не переписывать, а галочку где-нибудь поставить, чтобы всё заработало сразу. :)