mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
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:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user