Merge pull request #4474 from mbaulch/fix3516

Recursively check literals for tyEmpty.
This commit is contained in:
Andreas Rumpf
2016-07-11 16:14:13 +02:00
committed by GitHub
2 changed files with 19 additions and 2 deletions

View File

@@ -411,6 +411,13 @@ proc semUsing(c: PContext; n: PNode): PNode =
if a.sons[length-1].kind != nkEmpty:
localError(a.info, "'using' sections cannot contain assignments")
proc hasEmpty(typ: PType): bool =
if typ.kind in {tySequence, tyArray, tySet}:
result = typ.lastSon.kind == tyEmpty
elif typ.kind == tyTuple:
for s in typ.sons:
result = result or hasEmpty(s)
proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode =
var b: PNode
result = copyNode(n)
@@ -445,8 +452,7 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode =
#changeType(def.skipConv, typ, check=true)
else:
typ = skipIntLit(def.typ)
if typ.kind in {tySequence, tyArray, tySet} and
typ.lastSon.kind == tyEmpty:
if hasEmpty(typ):
localError(def.info, errCannotInferTypeOfTheLiteral,
($typ.kind).substr(2).toLower)
else:

View File

@@ -0,0 +1,11 @@
discard """
file: "tassignemptytuple.nim"
line: 11
errormsg: "cannot infer the type of the tuple"
"""
var
foo: seq[int]
bar: tuple[a: seq[int], b: set[char]]
(foo, bar) = (@[], (@[], {}))