После обновления до 10.2 Tokyo один из сторонних компонентов начал выдавать множество исключений. Отладка показала проблемную часть кода, которая может быть представлена этим (надеюсь) минимальным кодом:
function foo(i: Integer): Boolean;
label bar;
begin
try
if i=1 then goto bar;
Result:=False;
EXIT;
bar:
Result:=True; //<~~ H2077 Value assigned to 'foo' never used with Optimization on
finally
end;
end;
Если для параметра Оптимизация в параметрах компилятора задано значение
- True (по умолчанию для Конфигурация выпуска) —
foo(1)
возвращаетFalse
- False (по умолчанию для Конфигурация отладки) —
foo(1)
возвращаетTrue
В XE7 такой проблемы нет. Этот ответ, объясняющий изменения в компиляторе Токио, вероятно, связан, но, возможно, исправление некоторых новых проблем.
Мой вопрос: это дефект компилятора Токио? Я почти уверен, что это так, но я новичок в программировании на Delphi, и было бы здорово получить подтверждение от более опытных пользователей.
Если это дефект компилятора, то у меня есть дополнительный вопрос: есть ли какой-нибудь быстрый способ исправить этот код? Я знаю, как удалить goto
в моем MCVE с помощью простого оператора if then else
, но реальный код намного сложнее:
if cond1 then goto bar;
if cond2 then goto bar;
if cond3 then goto bar;
...
if condN then goto bar;
И некоторые из блоков if
также содержат циклы с внутренними goto
. Я знаю, как переписать всю эту логику во вложенные if then else
блоки, но, возможно, есть более простой способ исправить это, не дожидаясь исправления дефекта компилятора или стороннего компонента (я знаю, что ничего из этого не произойдет в ближайшее время).