propagate efWantStmt in semWhen (#23400)

fixes #23399

The new case introduced in #21657 is triggered by `efWantStmt` but the
`when` statement doesn't normally propagate this flag, so propagate it
when the `semCheck` param in `semWhen` is true which happens when the
`when` statement is `efWhenStmt` anyway.

(cherry picked from commit fb6c805568)
This commit is contained in:
metagn
2024-03-14 13:23:09 +03:00
committed by narimiran
parent d112874078
commit 1ac5aa951d
2 changed files with 11 additions and 3 deletions

View File

@@ -2550,9 +2550,10 @@ proc semWhen(c: PContext, n: PNode, semCheck = true): PNode =
# If semCheck is set to false, ``when`` will return the verbatim AST of
# the correct branch. Otherwise the AST will be passed through semStmt.
result = nil
let flags = if semCheck: {efWantStmt} else: {}
template setResult(e: untyped) =
if semCheck: result = semExpr(c, e) # do not open a new scope!
if semCheck: result = semExpr(c, e, flags) # do not open a new scope!
else: result = e
# Check if the node is "when nimvm"
@@ -2578,7 +2579,7 @@ proc semWhen(c: PContext, n: PNode, semCheck = true): PNode =
checkSonsLen(it, 2, c.config)
if whenNimvm:
if semCheck:
it[1] = semExpr(c, it[1])
it[1] = semExpr(c, it[1], flags)
typ = commonType(c, typ, it[1].typ)
result = n # when nimvm is not elimited until codegen
else:
@@ -2594,7 +2595,7 @@ proc semWhen(c: PContext, n: PNode, semCheck = true): PNode =
checkSonsLen(it, 1, c.config)
if result == nil or whenNimvm:
if semCheck:
it[0] = semExpr(c, it[0])
it[0] = semExpr(c, it[0], flags)
typ = commonType(c, typ, it[0].typ)
if result == nil:
result = it[0]

View File

@@ -13,3 +13,10 @@ proc foo() =
sequtils
foo()
# issue #23399
when isMainModule:
sequtils #[tt.Error
^ expression has no type: sequtils]#
discard