fix wrong error for iterators with no body and pragma macro (#24440)

fixes #16413

`semIterator` checks if the original iterator passed to it has no body,
but it should check the processed node created by `semProcAux`.
This commit is contained in:
metagn
2024-11-16 00:52:38 +03:00
committed by GitHub
parent cd9ce377f8
commit e239968b80
2 changed files with 18 additions and 1 deletions

View File

@@ -2648,7 +2648,7 @@ proc semIterator(c: PContext, n: PNode): PNode =
incl(s.typ.flags, tfCapturesEnv)
else:
s.typ.callConv = ccInline
if n[bodyPos].kind == nkEmpty and s.magic == mNone and c.inConceptDecl == 0:
if result[bodyPos].kind == nkEmpty and s.magic == mNone and c.inConceptDecl == 0:
localError(c.config, n.info, errImplOfXexpected % s.name.s)
if optOwnedRefs in c.config.globalOptions and result.typ != nil:
result.typ() = makeVarType(c, result.typ, tyOwned)

View File

@@ -0,0 +1,17 @@
# issue #16413
import std/macros
macro identity(x: untyped) =
result = x.copy()
result[6] = quote do:
yield 1
discard result.toStrLit
iterator demo(): int {.identity.}
iterator demo2(): int {.identity.} = discard # but this works as expected
var s: seq[int] = @[]
for e in demo():
s.add(e)
doAssert s == @[1]