summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2017-11-01 15:33:20 +0100
committerAndreas Rumpf <rumpf_a@web.de>2017-11-01 15:33:28 +0100
commit286f89528028fc3ae9e441a18be2be11cf499174 (patch)
treea80b1ab92cc5090f5f3ef3206f3ecd93b085139d
parent6f9cd35733211d04ba9ba6e7b7a5d32e5f3e5299 (diff)
downloadNim-286f89528028fc3ae9e441a18be2be11cf499174.tar.gz
make range type checking more restrictive, see tn8vsint16 test case; minor breaking change
-rw-r--r--compiler/sigmatch.nim11
-rw-r--r--tests/range/tn8vsint16.nim18
2 files changed, 28 insertions, 1 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim
index 1494c5316..231dd80f4 100644
--- a/compiler/sigmatch.nim
+++ b/compiler/sigmatch.nim
@@ -390,7 +390,16 @@ proc isConvertibleToRange(f, a: PType): bool =
   # be less picky for tyRange, as that it is used for array indexing:
   if f.kind in {tyInt..tyInt64, tyUInt..tyUInt64} and
      a.kind in {tyInt..tyInt64, tyUInt..tyUInt64}:
-    result = true
+    case f.kind
+    of tyInt, tyInt64: result = true
+    of tyInt8: result = a.kind in {tyInt8, tyInt}
+    of tyInt16: result = a.kind in {tyInt8, tyInt16, tyInt}
+    of tyInt32: result = a.kind in {tyInt8, tyInt16, tyInt32, tyInt}
+    of tyUInt, tyUInt64: result = true
+    of tyUInt8: result = a.kind in {tyUInt8, tyUInt}
+    of tyUInt16: result = a.kind in {tyUInt8, tyUInt16, tyUInt}
+    of tyUInt32: result = a.kind in {tyUInt8, tyUInt16, tyUInt32, tyUInt}
+    else: result = false
   elif f.kind in {tyFloat..tyFloat128} and
        a.kind in {tyFloat..tyFloat128}:
     result = true
diff --git a/tests/range/tn8vsint16.nim b/tests/range/tn8vsint16.nim
new file mode 100644
index 000000000..612b6d0e7
--- /dev/null
+++ b/tests/range/tn8vsint16.nim
@@ -0,0 +1,18 @@
+discard """
+  output: '''9'''
+"""
+
+type
+  n32 = range[0..high(int)]
+  n8* = range[0'i8..high(int8)]
+
+proc `+`*(a: n32, b: n32{nkIntLit}): n32 = discard
+
+proc `-`*(a: n8, b: n8): n8 = n8(system.`-`(a, b))
+
+var x, y: n8
+var z: int16
+
+# ensure this doesn't call our '-' but system.`-` for int16:
+echo z - n8(9)
+