После обновления до 10.2 Токио один из сторонних компонентов начал бросать много исключений. Отладка показала проблемную часть кода, которая может быть представлена этим (надеюсь) минимальным кодом:
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 (по умолчанию для конфигурации Release) -
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
, но, возможно, есть более простой способ исправить ее, не дожидаясь исправления дефекта компилятора или стороннего компонента (я знаю, что любой из них не скоро произойдет)).