mirror of
https://github.com/nim-lang/Nim.git
synced 2026-06-14 15:43:45 +00:00
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
(cherry picked from commit 0448557bfe)
This commit is contained in:
committed by
narimiran
parent
de02dbf8a1
commit
2d30ebaea9
@@ -1169,6 +1169,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:
|
||||
|
||||
28
tests/concepts/conceptv2negative/tconsistentparams.nim
Normal file
28
tests/concepts/conceptv2negative/tconsistentparams.nim
Normal 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)
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user