bugfix: constraint matching for tyGenericInst; implements #130

This commit is contained in:
Araq
2012-07-19 08:41:57 +02:00
parent b9e7f30dda
commit c9513c2e5a
3 changed files with 32 additions and 2 deletions

View File

@@ -198,7 +198,14 @@ proc semTypeIdent(c: PContext, n: PNode): PSym =
return result.typ.sym
else:
return result.typ.sym
if result.kind != skType: GlobalError(n.info, errTypeExpected)
if result.kind != skType:
# this implements the wanted ``var v: V, x: V`` feature ...
var ov: TOverloadIter
var amb = InitOverloadIter(ov, c, n)
while amb != nil and amb.kind != skType:
amb = nextOverloadIter(ov, c, n)
if amb != nil: result = amb
else: GlobalError(n.info, errTypeExpected)
if result.typ.kind != tyGenericParam:
# XXX get rid of this hack!
reset(n[])

View File

@@ -249,7 +249,7 @@ proc tupleRel(c: var TCandidate, f, a: PType): TTypeRelation =
proc matchTypeClass(c: var TCandidate, f, a: PType): TTypeRelation =
for i in countup(0, f.sonsLen - 1):
let son = f.sons[i]
var match = son.kind == skipTypes(a, {tyRange}).kind
var match = son.kind == skipTypes(a, {tyRange, tyGenericInst}).kind
if not match:
case son.kind

View File

@@ -62,3 +62,26 @@ proc Foo(n: int): int =
# We should come till here :-)
discard Foo(345)
# test the new type symbol lookup feature:
type
MyType[T] = tuple[
x, y, z: T]
MyType2 = tuple[x, y: float]
proc main[T]() =
var myType: MyType[T]
var b: MyType[T]
b = (1, 2, 3)
myType = b
echo myType
var myType2: MyType2
var c: MyType2
c = (1.0, 2.0)
myType2 = c
echo myType2
main[int]()