mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-27 01:34:02 +00:00
enforce 'var T' produces a view into the first parameter; refs #7373
This commit is contained in:
@@ -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]
|
||||
|
||||
12
tests/varres/twrong_parameter.nim
Normal file
12
tests/varres/twrong_parameter.nim
Normal file
@@ -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()
|
||||
Reference in New Issue
Block a user