diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2024-04-26 22:02:02 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-26 16:02:02 +0200 |
commit | 0b0f185bd1db2500079aefd888078b6bd1094270 (patch) | |
tree | f59c8a0145bc27e354924c176e1ae0a5aa9c36a2 | |
parent | 407c0cb64a804e6f5ffa693ec0e79c9171393a29 (diff) | |
download | Nim-0b0f185bd1db2500079aefd888078b6bd1094270.tar.gz |
fixes #23536; Stack trace with wrong line number when the proc called inside for loop (#23540)
fixes #23536
-rw-r--r-- | compiler/transf.nim | 14 | ||||
-rw-r--r-- | tests/errmsgs/t23536.nim | 26 |
2 files changed, 34 insertions, 6 deletions
diff --git a/compiler/transf.nim b/compiler/transf.nim index 070443b82..6888fc223 100644 --- a/compiler/transf.nim +++ b/compiler/transf.nim @@ -456,6 +456,14 @@ proc transformYield(c: PTransf, n: PNode): PNode = let rhs = transform(c, e) result.add(asgnTo(lhs, rhs)) + + # bug #23536; note that the info of forLoopBody should't change + for idx in 0 ..< result.len: + var changeNode = result[idx] + changeNode.info = c.transCon.forStmt.info + for i, child in changeNode: + child.info = changeNode.info + inc(c.transCon.yieldStmts) if c.transCon.yieldStmts <= 1: # common case @@ -466,12 +474,6 @@ proc transformYield(c: PTransf, n: PNode): PNode = result.add(introduceNewLocalVars(c, c.transCon.forLoopBody)) c.isIntroducingNewLocalVars = false - for idx in 0 ..< result.len: - var changeNode = result[idx] - changeNode.info = c.transCon.forStmt.info - for i, child in changeNode: - child.info = changeNode.info - proc transformAddrDeref(c: PTransf, n: PNode, kinds: TNodeKinds): PNode = result = transformSons(c, n) # inlining of 'var openarray' iterators; bug #19977 diff --git a/tests/errmsgs/t23536.nim b/tests/errmsgs/t23536.nim new file mode 100644 index 000000000..610a85bab --- /dev/null +++ b/tests/errmsgs/t23536.nim @@ -0,0 +1,26 @@ +discard """ + matrix: "--stackTrace:on --excessiveStackTrace:off" +""" + +const expected = """ +wrong trace: +t23536.nim(22) t23536 +t23536.nim(17) foo +assertions.nim(41) failedAssertImpl +assertions.nim(36) raiseAssert +fatal.nim(53) sysFatal +""" + + +try: + proc foo = # bug #23536 + doAssert false + + for i in 0 .. 1: + + + foo() +except AssertionDefect: + let e = getCurrentException() + let trace = e.getStackTrace + doAssert "wrong trace:\n" & trace == expected |