This commit is contained in:
Araq 2020-03-16 12:54:31 +01:00 • committed by Andreas Rumpf
commit a102eb5ef6
3 changed files with 34 additions and 6 deletions

View file

@ -232,13 +232,14 @@ proc semConv(c: PContext, n: PNode): PNode =
result = newNodeI(nkConv, n.info)
var targetType = semTypeNode(c, n[0], nil)
if targetType.kind == tyTypeDesc:
case targetType.kind
of tyTypeDesc:
internalAssert c.config, targetType.len > 0
if targetType.base.kind == tyNone:
return semTypeOf(c, n)
else:
targetType = targetType.base
elif targetType.kind == tyStatic:
of tyStatic:
var evaluated = semStaticExpr(c, n[1])
if evaluated.kind == nkType or evaluated.typ.kind == tyTypeDesc:
result = n
@ -248,6 +249,7 @@ proc semConv(c: PContext, n: PNode): PNode =
return evaluated
else:
targetType = targetType.base
else: discard
maybeLiftType(targetType, c, n[0].info)
@ -268,7 +270,7 @@ proc semConv(c: PContext, n: PNode): PNode =
targetType.skipTypes(abstractPtrs).kind == tyObject:
localError(c.config, n.info, "object construction uses ':', not '='")
var op = semExprWithType(c, n[1])
if targetType.isMetaType:
if targetType.kind != tyGenericParam and targetType.isMetaType:
let final = inferWithMetatype(c, targetType, op, true)
result.add final
result.typ = final.typ
@ -279,6 +281,10 @@ proc semConv(c: PContext, n: PNode): PNode =
# here or needs to be overwritten too then.
result.add op
if targetType.kind == tyGenericParam:
result.typ = makeTypeFromExpr(c, copyTree(result))
return result
if not isSymChoice(op):
let status = checkConvertible(c, result.typ, op)
case status