Converters to take into account constraints. Fixes #7520 (#8593)

This commit is contained in:
cooldome
2018-08-13 15:02:20 +02:00
committed by Andreas Rumpf
parent ee29370f60
commit aa1cdebdc2
2 changed files with 24 additions and 0 deletions

View File

@@ -1809,6 +1809,10 @@ proc userConvMatch(c: PContext, m: var TCandidate, f, a: PType,
# see tests/tgenericconverter:
let srca = typeRel(m, src, a)
if srca notin {isEqual, isGeneric, isSubtype}: continue
let constraint = c.converters[i].typ.n[1].sym.constraint
if not constraint.isNil and not matchNodeKinds(constraint, arg):
continue
let destIsGeneric = containsGenericType(dest)
if destIsGeneric:

View File

@@ -0,0 +1,20 @@
discard """
file: "tconverter_with_constraint.nim"
line: 20
errormsg: "type mismatch: got <int>"
"""
type
MyType = distinct int
converter to_mytype(m: int{lit}): MyType =
m.MyType
proc myproc(m: MyType) =
echo m.int, ".MyType"
myproc(1) # call by literal is ok
var x: int = 12
myproc(x) # should fail