From 1fa3a9dac25e982624164898d98f22565c16d566 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Wed, 25 Jan 2017 09:34:45 +0100 Subject: [PATCH] bugfix: inline iterator do not mess up line information anymore --- compiler/transf.nim | 10 +++++++--- tests/errmsgs/tproper_stacktrace2.nim | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 tests/errmsgs/tproper_stacktrace2.nim diff --git a/compiler/transf.nim b/compiler/transf.nim index 4208c43e5..6eed17b2a 100644 --- a/compiler/transf.nim +++ b/compiler/transf.nim @@ -133,13 +133,17 @@ proc transformSymAux(c: PTransf, n: PNode): PNode = # simply exchange the symbol: b = s.getBody if b.kind != nkSym: internalError(n.info, "wrong AST for borrowed symbol") - b = newSymNode(b.sym) - b.info = n.info + b = newSymNode(b.sym, n.info) else: b = n while tc != nil: result = idNodeTableGet(tc.mapping, b.sym) - if result != nil: return + if result != nil: + # this slightly convoluted way ensures the line info stays correct: + if result.kind == nkSym: + result = copyNode(result) + result.info = n.info + return tc = tc.next result = b diff --git a/tests/errmsgs/tproper_stacktrace2.nim b/tests/errmsgs/tproper_stacktrace2.nim new file mode 100644 index 000000000..5f312b870 --- /dev/null +++ b/tests/errmsgs/tproper_stacktrace2.nim @@ -0,0 +1,22 @@ +discard """ + outputsub: '''tproper_stacktrace2.nim(20) main''' + exitcode: 1 +""" + +proc returnsNil(): string = return nil + +iterator fields*(a, b: int): int = + if a == b: + for f in a..b: + yield f + else: + for f in a..b: + yield f + +proc main(): string = + result = "" + for i in fields(0, 1): + let x = returnsNil() + result &= "string literal " & $x + +echo main()