bugfix: constraint matching for tyGenericInst; implements #130

This commit is contained in:
Araq 2012-07-19 08:41:57 +02:00
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 return result.typ.sym
else: else:
return result.typ.sym 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: if result.typ.kind != tyGenericParam:
# XXX get rid of this hack! # XXX get rid of this hack!
reset(n[]) 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 = proc matchTypeClass(c: var TCandidate, f, a: PType): TTypeRelation =
for i in countup(0, f.sonsLen - 1): for i in countup(0, f.sonsLen - 1):
let son = f.sons[i] 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: if not match:
case son.kind case son.kind

View file

@ -62,3 +62,26 @@ proc Foo(n: int): int =
# We should come till here :-) # We should come till here :-)
discard Foo(345) 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]()