H2077内部尝试最终阻止与goto - 它是东京的编译器缺陷?

Bra*_*cku 13 delphi delphi-10.2-tokyo

在升级到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;
Run Code Online (Sandbox Code Playgroud)

将编译器选项中的优化设置为

  • True(发布配置的默认值) - foo(1)返回False
  • False(Debug配置的默认值) - foo(1)返回True

在XE7中不会发生这样的问题.这个答案解释了东京编译器的变化可能是相关的 - 但也许修复了一些新引入的问题.

我的问题是: 东京的编译器存在缺陷吗?我很确定它是,但我是Delphi编程的新手,很高兴得到更有经验的用户的确认.

如果是编译器的缺陷,那么我有一个跟进问题:是否有任何快速方法来修复此代码?我知道如何goto用简单的if then else语句删除我的MCVE ,但真正的代码更复杂:

if cond1 then goto bar;
if cond2 then goto bar;
if cond3 then goto bar;
...
if condN then goto bar;
Run Code Online (Sandbox Code Playgroud)

而且一些if块也包含内部循环goto.我知道如何将所有这些逻辑重写为嵌套if then else块,但也许有一种更简单的方法来修复它而无需等待编译器的缺陷或第三方组件被修复(我知道其中任何一个都不会很快发生).

Dav*_*nan 7

这是一个编译器缺陷.foo(1)应该回来True.看起来优化器对这种特殊用途感到困惑goto.

向Embarcadero提交错误报告.要在此期间解决问题,您可以:

  • 联系第三方组件供应商并要求解决方法,或
  • 重写代码以避免goto看起来混淆了优化器,或者
  • 恢复到没有缺陷的旧版本编译器,或
  • 禁用受缺陷影响的任何功能的优化.

  • 按照您的建议并提交[RSP-19110](https://quality.embarcadero.com/browse/RSP-19110). (5认同)