diff options
-rw-r--r-- | compiler/ccgstmts.nim | 7 | ||||
-rw-r--r-- | tests/errmsgs/tproper_stacktrace3.nim | 23 |
2 files changed, 28 insertions, 2 deletions
diff --git a/compiler/ccgstmts.nim b/compiler/ccgstmts.nim index 45d675f64..02119d63e 100644 --- a/compiler/ccgstmts.nim +++ b/compiler/ccgstmts.nim @@ -1103,8 +1103,8 @@ proc asgnFieldDiscriminant(p: BProc, e: PNode) = genAssignment(p, a, tmp, {}) proc genAsgn(p: BProc, e: PNode, fastAsgn: bool) = - genLineDir(p, e) if e.sons[0].kind == nkSym and sfGoto in e.sons[0].sym.flags: + genLineDir(p, e) genGotoVar(p, e.sons[1]) elif not fieldDiscriminantCheckNeeded(p, e): var a: TLoc @@ -1114,8 +1114,11 @@ proc genAsgn(p: BProc, e: PNode, fastAsgn: bool) = initLocExpr(p, e.sons[0], a) if fastAsgn: incl(a.flags, lfNoDeepCopy) assert(a.t != nil) - loadInto(p, e.sons[0], e.sons[1], a) + let ri = e.sons[1] + genLineDir(p, ri) + loadInto(p, e.sons[0], ri, a) else: + genLineDir(p, e) asgnFieldDiscriminant(p, e) proc genStmts(p: BProc, t: PNode) = diff --git a/tests/errmsgs/tproper_stacktrace3.nim b/tests/errmsgs/tproper_stacktrace3.nim new file mode 100644 index 000000000..c292fa092 --- /dev/null +++ b/tests/errmsgs/tproper_stacktrace3.nim @@ -0,0 +1,23 @@ +discard """ + outputsub: '''tproper_stacktrace3.nim(21) main''' + exitcode: 1 +""" + +# bug #5400 + +type Container = object + val: int + +proc actualResolver(x: ptr Container): ptr Container = x + +template resolve(): untyped = actualResolver(db) + +proc myfail(): int = + doAssert false + +proc main() = + var db: ptr Container = nil + # actualResolver(db).val = myfail() # actualResolver is not included in stack trace. + resolve().val = myfail() # resolve template is included in stack trace. + +main() |