Fix wrong heuristic in codegen (#9293)

A bare return may trigger the insertion of a genericReset.

Fixes #9286
This commit is contained in:
LemonBoy
2018-10-11 08:36:05 +02:00
committed by Andreas Rumpf
parent 8ed3dac1dc
commit 7775b7efd1
2 changed files with 29 additions and 1 deletions

View File

@@ -771,7 +771,13 @@ proc allPathsAsgnResult(n: PNode): InitResultEnum =
result = InitRequired
of nkReturnStmt:
if n.len > 0:
result = allPathsAsgnResult(n[0])
if n[0].kind == nkEmpty and result != InitSkippable:
# This is a bare `return` statement, if `result` was not initialized
# anywhere else (or if we're not sure about this) let's require it to be
# initialized. This avoids cases like #9286 where this heuristic lead to
# wrong code being generated.
result = InitRequired
else: result = allPathsAsgnResult(n[0])
of nkIfStmt, nkIfExpr:
var exhaustive = false
result = InitSkippable

22
tests/ccgbugs/t9286.nim Normal file
View File

@@ -0,0 +1,22 @@
discard """
action: run
"""
import options
type Foo = ref object
i: int
proc next(foo: Foo): Option[Foo] =
try: assert(foo.i == 0)
except: return # 2º: none
return some(foo) # 1º: some
proc test =
let foo = Foo()
var opt = next(foo) # 1º Some
while isSome(opt) and foo.i < 10:
inc(foo.i)
opt = next(foo) # 2º None
assert foo.i == 1, $foo.i
test()