fixes #1655
This commit is contained in:
parent
8be177627a
commit
e9619d7278
3 changed files with 30 additions and 13 deletions
|
|
@ -1249,8 +1249,8 @@ proc semAsgn(c: PContext, n: PNode): PNode =
|
||||||
proc semReturn(c: PContext, n: PNode): PNode =
|
proc semReturn(c: PContext, n: PNode): PNode =
|
||||||
result = n
|
result = n
|
||||||
checkSonsLen(n, 1)
|
checkSonsLen(n, 1)
|
||||||
if c.p.owner.kind in {skConverter, skMethod, skProc, skMacro} or
|
if c.p.owner.kind in {skConverter, skMethod, skProc, skMacro,
|
||||||
c.p.owner.kind == skClosureIterator:
|
skClosureIterator}:
|
||||||
if n.sons[0].kind != nkEmpty:
|
if n.sons[0].kind != nkEmpty:
|
||||||
# transform ``return expr`` to ``result = expr; return``
|
# transform ``return expr`` to ``result = expr; return``
|
||||||
if c.p.resultSym != nil:
|
if c.p.resultSym != nil:
|
||||||
|
|
|
||||||
|
|
@ -939,6 +939,8 @@ proc semProcTypeNode(c: PContext, n, genericParams: PNode,
|
||||||
# turn explicit 'void' return type into 'nil' because the rest of the
|
# turn explicit 'void' return type into 'nil' because the rest of the
|
||||||
# compiler only checks for 'nil':
|
# compiler only checks for 'nil':
|
||||||
if skipTypes(r, {tyGenericInst}).kind != tyEmpty:
|
if skipTypes(r, {tyGenericInst}).kind != tyEmpty:
|
||||||
|
# 'auto' as a return type does not imply a generic:
|
||||||
|
if r.kind != tyExpr:
|
||||||
if r.sym == nil or sfAnon notin r.sym.flags:
|
if r.sym == nil or sfAnon notin r.sym.flags:
|
||||||
let lifted = liftParamType(c, kind, genericParams, r, "result",
|
let lifted = liftParamType(c, kind, genericParams, r, "result",
|
||||||
n.sons[0].info)
|
n.sons[0].info)
|
||||||
|
|
|
||||||
15
tests/metatype/tautonotgeneric.nim
Normal file
15
tests/metatype/tautonotgeneric.nim
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
discard """
|
||||||
|
output: "wof!"
|
||||||
|
"""
|
||||||
|
|
||||||
|
# bug #1659
|
||||||
|
type Animal = ref object {.inheritable.}
|
||||||
|
type Dog = ref object of Animal
|
||||||
|
|
||||||
|
method say(a: Animal): auto = "wat!"
|
||||||
|
method say(a: Dog): auto = "wof!"
|
||||||
|
|
||||||
|
proc saySomething(a: Animal): auto = a.say()
|
||||||
|
|
||||||
|
var a = Dog()
|
||||||
|
echo saySomething(a)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue