Skip to content

Commit

Permalink
enforce 'var T' produces a view into the first parameter; refs #7373
Browse files Browse the repository at this point in the history
  • Loading branch information
Araq committed Mar 24, 2018
1 parent 6f74767 commit 3be4f91
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 4 deletions.
11 changes: 7 additions & 4 deletions compiler/semexprs.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1304,10 +1304,13 @@ proc takeImplicitAddr(c: PContext, n: PNode; isLent: bool): PNode =
# See RFC #7373, calls returning 'var T' are assumed to
# return a view into the first argument (if there is one):
let root = exprRoot(n)
if root != nil and root.owner == c.p.owner and
root.kind in {skLet, skVar, skTemp} and sfGlobal notin root.flags:
localError(n.info, "'$1' escapes its stack frame; context: '$2'" % [
root.name.s, renderTree(n, {renderNoComments})])
if root != nil and root.owner == c.p.owner:
if root.kind in {skLet, skVar, skTemp} and sfGlobal notin root.flags:
localError(n.info, "'$1' escapes its stack frame; context: '$2'" % [
root.name.s, renderTree(n, {renderNoComments})])
elif root.kind == skParam and root.position != 0:
localError(n.info, "'$1' is not the first parameter; context: '$2'" % [
root.name.s, renderTree(n, {renderNoComments})])
case n.kind
of nkHiddenAddr, nkAddr: return n
of nkHiddenDeref, nkDerefExpr: return n.sons[0]
Expand Down
12 changes: 12 additions & 0 deletions tests/varres/twrong_parameter.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
discard """
line: 6
errormsg: "'x' is not the first parameter; context: 'x'"
"""

proc forward(abc: int; x: var int): var int = result = x

proc foo(): var int =
var y = 9
result = forward(45, y)

echo foo()

0 comments on commit 3be4f91

Please sign in to comment.