fixes #11073
This commit is contained in:
parent
fabc2a7086
commit
665fcb12dd
2 changed files with 39 additions and 2 deletions
|
|
@ -1528,8 +1528,10 @@ proc asgnToResultVar(c: PContext, n, le, ri: PNode) {.inline.} =
|
||||||
|
|
||||||
proc asgnToResult(c: PContext, n, le, ri: PNode) =
|
proc asgnToResult(c: PContext, n, le, ri: PNode) =
|
||||||
# Special typing rule: do not allow to pass 'owned T' to 'T' in 'result = x':
|
# Special typing rule: do not allow to pass 'owned T' to 'T' in 'result = x':
|
||||||
if ri.typ != nil and ri.typ.skipTypes(abstractInst).kind == tyOwned and
|
const absInst = abstractInst - {tyOwned}
|
||||||
le.typ != nil and le.typ.skipTypes(abstractInst).kind != tyOwned and ri.kind in nkCallKinds:
|
if ri.typ != nil and ri.typ.skipTypes(absInst).kind == tyOwned and
|
||||||
|
le.typ != nil and le.typ.skipTypes(absInst).kind != tyOwned and
|
||||||
|
ri.kind in nkCallKinds+{nkObjConstr}:
|
||||||
localError(c.config, n.info, "cannot return an owned pointer as an unowned pointer; " &
|
localError(c.config, n.info, "cannot return an owned pointer as an unowned pointer; " &
|
||||||
"use 'owned(" & typeToString(le.typ) & ")' as the return type")
|
"use 'owned(" & typeToString(le.typ) & ")' as the return type")
|
||||||
|
|
||||||
|
|
|
||||||
35
tests/destructor/tdont_return_unowned_from_owned.nim
Normal file
35
tests/destructor/tdont_return_unowned_from_owned.nim
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
discard """
|
||||||
|
cmd: "nim check --newruntime --hints:off $file"
|
||||||
|
nimout: '''tdont_return_unowned_from_owned.nim(24, 10) Error: cannot return an owned pointer as an unowned pointer; use 'owned(Obj)' as the return type
|
||||||
|
tdont_return_unowned_from_owned.nim(27, 10) Error: cannot return an owned pointer as an unowned pointer; use 'owned(Obj)' as the return type
|
||||||
|
tdont_return_unowned_from_owned.nim(30, 6) Error: type mismatch: got <Obj>
|
||||||
|
but expected one of:
|
||||||
|
proc new[T](a: var ref T; finalizer: proc (x: ref T) {.nimcall.})
|
||||||
|
2 other mismatching symbols have been suppressed; compile with --showAllMismatches:on to see them
|
||||||
|
|
||||||
|
expression: new(result)
|
||||||
|
tdont_return_unowned_from_owned.nim(30, 6) Error: illformed AST:
|
||||||
|
'''
|
||||||
|
errormsg: "illformed AST:"
|
||||||
|
line: 30
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# bug #11073
|
||||||
|
type
|
||||||
|
Obj = ref object
|
||||||
|
|
||||||
|
proc newObjA(): Obj =
|
||||||
|
result = new Obj
|
||||||
|
|
||||||
|
proc newObjB(): Obj =
|
||||||
|
result = Obj()
|
||||||
|
|
||||||
|
proc newObjC(): Obj =
|
||||||
|
new(result)
|
||||||
|
|
||||||
|
let a = newObjA()
|
||||||
|
let b = newObjB()
|
||||||
|
let c = newObjC()
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue