fixes #19159 [backport:1.6] (#19210)

This commit is contained in:
Andreas Rumpf 2021-12-04 07:44:26 +01:00 • committed by GitHub
commit 1cbdc1573a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 3 deletions

View file

@ -852,13 +852,14 @@ proc trackCall(tracked: PEffects; n: PNode) =
assumeTheWorst(tracked, n, op) assumeTheWorst(tracked, n, op)
gcsafeAndSideeffectCheck() gcsafeAndSideeffectCheck()
else: else:
if strictEffects in tracked.c.features and a.kind == nkSym and a.sym.kind in routineKinds: if strictEffects in tracked.c.features and a.kind == nkSym and
a.sym.kind in routineKinds:
propagateEffects(tracked, n, a.sym) propagateEffects(tracked, n, a.sym)
else: else:
mergeRaises(tracked, effectList[exceptionEffects], n) mergeRaises(tracked, effectList[exceptionEffects], n)
mergeTags(tracked, effectList[tagEffects], n) mergeTags(tracked, effectList[tagEffects], n)
gcsafeAndSideeffectCheck() gcsafeAndSideeffectCheck()
if a.kind != nkSym or a.sym.magic notin {mNBindSym, mFinished}: if a.kind != nkSym or a.sym.magic notin {mNBindSym, mFinished, mExpandToAst, mQuoteAst}:
for i in 1..<n.len: for i in 1..<n.len:
trackOperandForIndirectCall(tracked, n[i], op, i, a) trackOperandForIndirectCall(tracked, n[i], op, i, a)
if a.kind == nkSym and a.sym.magic in {mNew, mNewFinalize, mNewSeq}: if a.kind == nkSym and a.sym.magic in {mNew, mNewFinalize, mNewSeq}:
@ -883,7 +884,7 @@ proc trackCall(tracked: PEffects; n: PNode) =
optStaticBoundsCheck in tracked.currOptions: optStaticBoundsCheck in tracked.currOptions:
checkBounds(tracked, n[1], n[2]) checkBounds(tracked, n[1], n[2])
if a.kind != nkSym or a.sym.magic != mRunnableExamples: if a.kind != nkSym or a.sym.magic notin {mRunnableExamples, mNBindSym, mExpandToAst, mQuoteAst}:
for i in 0..<n.safeLen: for i in 0..<n.safeLen:
track(tracked, n[i]) track(tracked, n[i])

View file

@ -15,3 +15,15 @@ proc fn(a: int, p1, p2: proc()) {.effectsOf: p1.} =
proc main() {.raises: [ValueError].} = proc main() {.raises: [ValueError].} =
fn(1, proc()=discard, proc() = raise newException(IOError, "foo")) fn(1, proc()=discard, proc() = raise newException(IOError, "foo"))
main() main()
# bug #19159
import macros
func mkEnter() =
template helper =
discard
when defined pass:
helper()
else:
let ast = getAst(helper())