fix range[enum] type conversion (#13204) [backport]
This commit is contained in:
parent
470faa97c6
commit
0606b6a44e
2 changed files with 36 additions and 2 deletions
|
|
@ -1149,9 +1149,10 @@ proc typeRel(c: var TCandidate, f, aOrig: PType,
|
||||||
f.n[i] = tryResolvingStaticExpr(c, f.n[i])
|
f.n[i] = tryResolvingStaticExpr(c, f.n[i])
|
||||||
result = typeRangeRel(f, a)
|
result = typeRangeRel(f, a)
|
||||||
else:
|
else:
|
||||||
if skipTypes(f, {tyRange}).kind == a.kind:
|
let f = skipTypes(f, {tyRange})
|
||||||
|
if f.kind == a.kind and (f.kind != tyEnum or sameEnumTypes(f, a)):
|
||||||
result = isIntConv
|
result = isIntConv
|
||||||
elif isConvertibleToRange(skipTypes(f, {tyRange}), a):
|
elif isConvertibleToRange(f, a):
|
||||||
result = isConvertible # a convertible to f
|
result = isConvertible # a convertible to f
|
||||||
of tyInt: result = handleRange(f, a, tyInt8, tyInt32)
|
of tyInt: result = handleRange(f, a, tyInt8, tyInt32)
|
||||||
of tyInt8: result = handleRange(f, a, tyInt8, tyInt8)
|
of tyInt8: result = handleRange(f, a, tyInt8, tyInt8)
|
||||||
|
|
|
||||||
33
tests/range/tenums.nim
Normal file
33
tests/range/tenums.nim
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
discard """
|
||||||
|
cmd: "nim check --hints:off $file"
|
||||||
|
errormsg: "type mismatch: got <BC>"
|
||||||
|
nimout: '''
|
||||||
|
tenums.nim(32, 20) Error: type mismatch: got <Letters>
|
||||||
|
but expected one of:
|
||||||
|
proc takesChristmasColor(color: ChristmasColors)
|
||||||
|
first type mismatch at position: 1
|
||||||
|
required type for color: ChristmasColors
|
||||||
|
but expression 'A' is of type: Letters
|
||||||
|
|
||||||
|
expression: takesChristmasColor(A)
|
||||||
|
tenums.nim(33, 20) Error: type mismatch: got <BC>
|
||||||
|
but expected one of:
|
||||||
|
proc takesChristmasColor(color: ChristmasColors)
|
||||||
|
first type mismatch at position: 1
|
||||||
|
required type for color: ChristmasColors
|
||||||
|
but expression 'BC(C)' is of type: BC
|
||||||
|
|
||||||
|
expression: takesChristmasColor(BC(C))
|
||||||
|
'''
|
||||||
|
"""
|
||||||
|
|
||||||
|
type
|
||||||
|
Colors = enum Red, Green, Blue
|
||||||
|
ChristmasColors = range[Red .. Green]
|
||||||
|
Letters = enum A, B, C
|
||||||
|
BC = range[B .. C]
|
||||||
|
|
||||||
|
proc takesChristmasColor(color: ChristmasColors) = discard
|
||||||
|
takesChristmasColor(Green)
|
||||||
|
takesChristmasColor(A)
|
||||||
|
takesChristmasColor(BC(C))
|
||||||
Loading…
Add table
Add a link
Reference in a new issue