Fixes multiple bugs with sink arguments (#9802)

* fixes #9781

* fix spacing
This commit is contained in:
cooldome 2018-11-26 08:45:45 +00:00 • committed by Andreas Rumpf
commit 2ac7f52388
4 changed files with 59 additions and 11 deletions

View file

@ -346,7 +346,7 @@ proc magicsAfterOverloadResolution(c: PContext, n: PNode,
result.info = n.info
result.typ = n.typ
else:
localError(c.config, n.info, "cannot evaluate 'sizeof' because its type is not defined completely")
localError(c.config, n.info, "cannot evaluate 'sizeof' because its type is not defined completely, type: " & n[1].typ.typeToString)
result = n
of mAlignOf:
result = newIntNode(nkIntLit, getAlign(c.config, n[1].typ))

View file

@ -432,7 +432,7 @@ proc handleFloatRange(f, a: PType): TTypeRelation =
else: result = isNone
proc genericParamPut(c: var TCandidate; last, fGenericOrigin: PType) =
if fGenericOrigin != nil and last.kind == tyGenericInst and
if fGenericOrigin != nil and last.kind == tyGenericInst and
last.len-1 == fGenericOrigin.len:
for i in countup(1, sonsLen(fGenericOrigin) - 1):
let x = PType(idTableGet(c.bindings, fGenericOrigin.sons[i]))
@ -1034,8 +1034,8 @@ proc typeRelImpl(c: var TCandidate, f, aOrig: PType,
template doBind: bool = trDontBind notin flags
# var and static arguments match regular modifier-free types
var a = maybeSkipDistinct(c, aOrig.skipTypes({tyStatic, tyVar, tyLent}), c.calleeSym)
# var, sink and static arguments match regular modifier-free types
var a = maybeSkipDistinct(c, aOrig.skipTypes({tyStatic, tyVar, tyLent, tySink}), c.calleeSym)
# XXX: Theoretically, maybeSkipDistinct could be called before we even
# start the param matching process. This could be done in `prepareOperand`
# for example, but unfortunately `prepareOperand` is not called in certain
@ -1045,7 +1045,7 @@ proc typeRelImpl(c: var TCandidate, f, aOrig: PType,
return typeRel(c, f, lastSon(aOrig))
if a.kind == tyGenericInst and
skipTypes(f, {tyVar, tyLent}).kind notin {
skipTypes(f, {tyVar, tyLent, tySink}).kind notin {
tyGenericBody, tyGenericInvocation,
tyGenericInst, tyGenericParam} + tyTypeClasses:
return typeRel(c, f, lastSon(a))

View file

@ -237,9 +237,9 @@ proc computeSizeAlign(conf: ConfigRef; typ: PType) =
# recursive tuplers are not allowed and should be detected in the frontend
if base.kind == tyTuple:
computeSizeAlign(conf, base)
if base.size == szIllegalRecursion:
typ.size = szIllegalRecursion
typ.align = szIllegalRecursion
if base.size < 0:
typ.size = base.size
typ.align = base.align
return
typ.align = int16(conf.target.ptrSize)
@ -379,7 +379,7 @@ proc computeSizeAlign(conf: ConfigRef; typ: PType) =
typ.size = typ.lastSon.size
typ.align = typ.lastSon.align
of tyGenericInst, tyDistinct, tyGenericBody, tyAlias:
of tyGenericInst, tyDistinct, tyGenericBody, tyAlias, tySink:
computeSizeAlign(conf, typ.lastSon)
typ.size = typ.lastSon.size
typ.align = typ.lastSon.align