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