fix range[enum] type conversion (#13204) [backport]

This commit is contained in:
Jasper Jenkins 2020-01-20 07:56:59 -08:00 • committed by Andreas Rumpf
commit 0606b6a44e
2 changed files with 36 additions and 2 deletions

View file

@ -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
View 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))