diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/semexprs.nim | 32 | ||||
-rw-r--r-- | compiler/sigmatch.nim | 2 | ||||
-rw-r--r-- | compiler/types.nim | 13 |
3 files changed, 12 insertions, 35 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 7a0ae3819..fc217262e 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -423,34 +423,21 @@ proc overloadedCallOpr(c: PContext, n: PNode): PNode = for i in countup(0, sonsLen(n) - 1): addSon(result, n.sons[i]) result = semExpr(c, result) -proc changeType(n: PNode, newType: PType, check: bool) = +proc changeType(n: PNode, newType: PType, check: bool) = case n.kind - of nkCurly, nkBracket: - for i in countup(0, sonsLen(n) - 1): + of nkCurly, nkBracket: + for i in countup(0, sonsLen(n) - 1): changeType(n.sons[i], elemType(newType), check) - of nkPar: - if newType.kind != tyTuple: + of nkPar: + if newType.kind != tyTuple: internalError(n.info, "changeType: no tuple type for constructor") - elif newType.n == nil: discard - elif sonsLen(n) > 0 and n.sons[0].kind == nkExprColonExpr: - for i in countup(0, sonsLen(n) - 1): - var m = n.sons[i].sons[0] - if m.kind != nkSym: - internalError(m.info, "changeType(): invalid tuple constr") - return - var f = getSymFromList(newType.n, m.sym.name) - if f == nil: - internalError(m.info, "changeType(): invalid identifier") - return - changeType(n.sons[i].sons[1], f.typ, check) else: for i in countup(0, sonsLen(n) - 1): var m = n.sons[i] - var a = newNodeIT(nkExprColonExpr, m.info, newType.sons[i]) - addSon(a, newSymNode(newType.n.sons[i].sym)) - addSon(a, m) + if m.kind == nkExprColonExpr: + m = m.sons[1] + n.sons[i] = m changeType(m, newType.sons[i], check) - n.sons[i] = a of nkCharLit..nkUInt64Lit: if check: let value = n.intVal @@ -541,7 +528,8 @@ proc fixAbstractType(c: PContext, n: PNode) = elif skipTypes(it.sons[1].typ, abstractVar).kind in {tyNil, tyArrayConstr, tyTuple, tySet}: var s = skipTypes(it.typ, abstractVar) - changeType(it.sons[1], s, check=true) + if s.kind != tyExpr: + changeType(it.sons[1], s, check=true) n.sons[i] = it.sons[1] of nkBracket: # an implicitly constructed array (passed to an open array): diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 123d1df2e..ba493bdfa 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -349,7 +349,7 @@ proc recordRel(c: var TCandidate, f, a: PType): TTypeRelation = var y = a.n.sons[i].sym if f.kind == tyObject and typeRel(c, x.typ, y.typ) < isSubtype: return isNone - if x.name.id != y.name.id: return isNone + if x.name.id != y.name.id and f.kind != tyTuple: return isNone proc allowsNil(f: PType): TTypeRelation {.inline.} = result = if tfNotNil notin f.flags: isSubtype else: isNone diff --git a/compiler/types.nim b/compiler/types.nim index 87f2e1a59..f67cd239e 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -762,7 +762,7 @@ proc sameTuple(a, b: PType, c: var TSameTypeClosure): bool = # two tuples are equivalent iff the names, types and positions are the same; # however, both types may not have any field names (t.n may be nil) which # complicates the matter a bit. - if sonsLen(a) == sonsLen(b): + if sonsLen(a) == sonsLen(b): result = true for i in countup(0, sonsLen(a) - 1): var x = a.sons[i] @@ -773,17 +773,6 @@ proc sameTuple(a, b: PType, c: var TSameTypeClosure): bool = result = sameTypeAux(x, y, c) if not result: return - if a.n != nil and b.n != nil and IgnoreTupleFields notin c.flags: - for i in countup(0, sonsLen(a.n) - 1): - # check field names: - if a.n.sons[i].kind == nkSym and b.n.sons[i].kind == nkSym: - var x = a.n.sons[i].sym - var y = b.n.sons[i].sym - result = x.name.id == y.name.id - if not result: break - else: internalError(a.n.info, "sameTuple") - else: - result = false template ifFastObjectTypeCheckFailed(a, b: PType, body: stmt) {.immediate.} = if tfFromGeneric notin a.flags + b.flags: |