Подтвердить что ты не робот

H2077 внутри try, наконец, блок с goto - это дефект компилятора Токио?

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

4b9b3361

Ответ 1

Это дефект компилятора. foo(1) должен возвращать True. Похоже, оптимизатор смущен этим конкретным использованием goto.

Отправьте отчет об ошибке в Embarcadero. Чтобы преодолеть проблему, вы можете:

  • Обратитесь к поставщику сторонних компонентов и попросите обходной путь, или
  • перезапишите код, чтобы избежать goto, который, кажется, запутает оптимизатора, или
  • вернуться к старой версии компилятора, который не является дефектным, или
  • отключить оптимизацию для любых функций, затронутых дефектом.