summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJasper Jenkins <jasper.vs.jenkins@gmail.com>2020-01-20 07:56:59 -0800
committerAndreas Rumpf <rumpf_a@web.de>2020-01-20 16:56:59 +0100
commit0606b6a44e2778697869ed33bff000a1548f36aa (patch)
treeb595df7737c047925c6ac7b96f3745b4b1b2c6c9
parent470faa97c60aa5d8153f00083913aca4f0dc1fdf (diff)
downloadNim-0606b6a44e2778697869ed33bff000a1548f36aa.tar.gz
fix range[enum] type conversion (#13204) [backport]
-rw-r--r--compiler/sigmatch.nim5
-rw-r--r--tests/range/tenums.nim33
2 files changed, 36 insertions, 2 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim
index c87b76622..677afc2d5 100644
--- a/compiler/sigmatch.nim
+++ b/compiler/sigmatch.nim
@@ -1149,9 +1149,10 @@ proc typeRel(c: var TCandidate, f, aOrig: PType,
             f.n[i] = tryResolvingStaticExpr(c, f.n[i])
         result = typeRangeRel(f, a)
     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
-      elif isConvertibleToRange(skipTypes(f, {tyRange}), a):
+      elif isConvertibleToRange(f, a):
         result = isConvertible  # a convertible to f
   of tyInt:      result = handleRange(f, a, tyInt8, tyInt32)
   of tyInt8:     result = handleRange(f, a, tyInt8, tyInt8)
diff --git a/tests/range/tenums.nim b/tests/range/tenums.nim
new file mode 100644
index 000000000..3cdf06fe2
--- /dev/null
+++ b/tests/range/tenums.nim
@@ -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))