H2077 inside try finally block with goto - 是东京的编译器缺陷吗?
H2077 inside try finally block with goto - is it Tokyo's compiler defect?
升级到 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)
returns False
- False(调试配置的默认设置)-
foo(1)
returns True
XE7不会出现这样的问题。 解释东京编译器的变化可能是相关的 - 但可能修复了一些新引入的问题。
我的问题是:
这是东京的编译器缺陷吗?我很确定是这样,但我是Delphi编程的新手,如果能得到更有经验的用户的确认就太好了。
如果这是编译器的缺陷,那么我有一个后续问题:有没有快速的方法来修复这段代码?我知道如何使用简单的 if then else
语句在我的 MCVE 中删除 goto
,但实际代码要复杂得多:
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
块,但也许有更简单的方法来修复它而无需等待编译器的缺陷或第三方组件被修复(我知道其中任何一个都不会很快就会发生)。
这是一个编译器缺陷。 foo(1)
应该 return True
。
看起来优化器对 goto
的这种特殊用法感到困惑。
向 Embarcadero 提交错误报告。要同时解决这个问题,您可以:
- 联系第三方组件供应商并寻求解决方法,或者
- 重新编写代码以避免
goto
这似乎混淆了优化器,或者
- 恢复到没有缺陷的旧版本编译器,或者
- 禁用受缺陷影响的任何功能的优化。
升级到 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)
returnsFalse
- False(调试配置的默认设置)-
foo(1)
returnsTrue
XE7不会出现这样的问题。
我的问题是: 这是东京的编译器缺陷吗?我很确定是这样,但我是Delphi编程的新手,如果能得到更有经验的用户的确认就太好了。
如果这是编译器的缺陷,那么我有一个后续问题:有没有快速的方法来修复这段代码?我知道如何使用简单的 if then else
语句在我的 MCVE 中删除 goto
,但实际代码要复杂得多:
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
块,但也许有更简单的方法来修复它而无需等待编译器的缺陷或第三方组件被修复(我知道其中任何一个都不会很快就会发生)。
这是一个编译器缺陷。 foo(1)
应该 return True
。
看起来优化器对 goto
的这种特殊用法感到困惑。
向 Embarcadero 提交错误报告。要同时解决这个问题,您可以:
- 联系第三方组件供应商并寻求解决方法,或者
- 重新编写代码以避免
goto
这似乎混淆了优化器,或者 - 恢复到没有缺陷的旧版本编译器,或者
- 禁用受缺陷影响的任何功能的优化。