two small concept patches (#25076)

- slightly better typeclass logic (eg for bare `range`)
- reverse matching now substitutes potential implementation for `Self`

---------

Co-authored-by: ringabout <43030857+ringabout@users.noreply.github.com>
This commit is contained in:
Ryan McConnell
2025-09-11 08:50:11 -04:00
committed by GitHub
parent d73f478bdc
commit 88da5e8cee
2 changed files with 31 additions and 3 deletions

View File

@@ -271,7 +271,10 @@ proc matchType(c: PContext; fo, ao: PType; m: var MatchCon): bool =
var
a = ao
f = fo
if a.isSelf:
if m.magic in {mArrPut, mArrGet}:
return false
a = m.potentialImplementation
if a.kind in bindableTypes:
a = existingBinding(m, ao)
if a == ao and a.kind == tyGenericParam and a.hasElementType and a.elementType.kind != tyNone:
@@ -337,8 +340,11 @@ proc matchType(c: PContext; fo, ao: PType; m: var MatchCon): bool =
result = true
else:
let ak = a.skipTypes(ignorableForArgType - {f.kind})
if ak.kind == f.kind and f.kidsLen == ak.kidsLen:
result = matchKids(c, f, ak, m)
if ak.kind == f.kind:
if f.base.kind == tyNone:
result = true
elif f.kidsLen == ak.kidsLen:
result = matchKids(c, f, ak, m)
of tyGenericInvocation, tyGenericInst:
result = false
let ea = a.skipTypes(ignorableForArgType)

View File

@@ -497,6 +497,28 @@ block:
spring({One,Two})
block: # bare `range`
type
MyRange = 0..64
MyConcept = concept
proc a(x: typedesc[Self])
proc a(x: typedesc[range]) = discard
proc spring(x: typedesc[MyConcept]) = discard
spring(MyRange)
block:
type
A = object
TestConcept =
concept
proc x(x: Self)
proc x(x: not object) =
discard
assert A isnot TestConcept
# this code fails inside a block for some reason
type Indexable[T] = concept
proc `[]`(t: Self, i: int): T