fix 25778; concept coerces incompatible types (#25781)

I don't like it, but seems like this is correct. Concept type classes
have to behave like other "named" type classes and participate in "bind
once" mechanics or require some weird semantics. As a side note I'm
pretty sure the `tuple` example in the manual explaining this is either
wrong now or has regressed, but I don't think it matters because I doubt
anyone thinks about this feature much.
#25778
This commit is contained in:
Ryan McConnell
2026-06-11 02:17:35 -04:00
committed by GitHub
parent 07685f79e0
commit 0448557bfe
3 changed files with 46 additions and 0 deletions

View File

@@ -1168,6 +1168,10 @@ proc enterConceptMatch(c: var TCandidate; f,a: PType, flags: TTypeRelFlags): TTy
if concpt.kind != tyConcept:
container = concpt
concpt = container.reduceToBase
# considerPreviousT-like behavior
let prev = lookup(c.bindings, concpt)
if prev != nil:
return typeRel(c, prev, a, flags)
if trDontBind in flags:
conceptFlags.incl mfDontBind
if trCheckGeneric in flags:

View File

@@ -0,0 +1,28 @@
discard """
action: "reject"
errormsg: "type mismatch"
"""
type
Dollarable = concept
proc `$`(x: Self): string
proc checkEqual(x, y: Dollarable) =
if x != y:
echo $x
echo $y
type
StateFlags = enum
sfMatch
sfSoft
MatchKind = enum
NoFurtherMatch
NoMatch
Match
AllFurtherMatch
proc `==`(a: set[StateFlags]; b: MatchKind): bool = true
checkEqual({sfMatch, sfSoft}, Match)

View File

@@ -14,6 +14,8 @@ b
c
1
2
5
test
'''
"""
import conceptsv2_helper
@@ -600,3 +602,15 @@ block:
let test = MemMapFileStream()
spring(test)
# explicit negative "bind once"
type
Dollarable = concept
proc `$`(x: Self): string
proc checkEqual2[T: Dollarable; S: Dollarable](x: T, y: S) =
echo $x
echo $y
checkEqual2(5, "test")