summary refs log tree commit diff stats
diff options
context:
space:
mode:
authormetagn <metagngn@gmail.com>2023-05-02 12:13:38 +0300
committerGitHub <noreply@github.com>2023-05-02 11:13:38 +0200
commitc2bcfd8cd908265c358c60c4da137783b10a8549 (patch)
tree55b4d8b1efae6e820c88f0118ce9c96e62451c7a
parentafc30ca87948c11f603f6686d4b10d3dcc27776a (diff)
downloadNim-c2bcfd8cd908265c358c60c4da137783b10a8549.tar.gz
cheap fix for #10853 + better tuple subscript error message (#21767)
* cheap fix for #10853

* also better tuple subscript error message

* weird
-rw-r--r--compiler/lowerings.nim2
-rw-r--r--compiler/semexprs.nim5
-rw-r--r--tests/errmsgs/tassignunpack.nim3
-rw-r--r--tests/errmsgs/ttupleindexoutofbounds.nim2
-rw-r--r--tests/types/tassignemptytuple.nim2
5 files changed, 11 insertions, 3 deletions
diff --git a/compiler/lowerings.nim b/compiler/lowerings.nim
index bd81773a8..d70c713a1 100644
--- a/compiler/lowerings.nim
+++ b/compiler/lowerings.nim
@@ -132,7 +132,7 @@ proc lowerTupleUnpackingForAsgn*(g: ModuleGraph; n: PNode; idgen: IdGenerator; o
 
   var vpart = newNodeI(nkIdentDefs, tempAsNode.info, 3)
   vpart[0] = tempAsNode
-  vpart[1] = newNodeI(nkEmpty, value.info)
+  vpart[1] = newNodeI(nkTupleClassTy, value.info)
   vpart[2] = value
   v.add vpart
   result.add(v)
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index 930fd3516..a01466868 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -1646,7 +1646,10 @@ proc semSubscript(c: PContext, n: PNode, flags: TExprFlags): PNode =
         {tyInt..tyInt64}:
       let idx = getOrdValue(n[1])
       if idx >= 0 and idx < arr.len: n.typ = arr[toInt(idx)]
-      else: localError(c.config, n.info, "invalid index value for tuple subscript")
+      else:
+        localError(c.config, n.info,
+          "invalid index $1 in subscript for tuple of length $2" %
+            [$idx, $arr.len])
       result = n
     else:
       result = nil
diff --git a/tests/errmsgs/tassignunpack.nim b/tests/errmsgs/tassignunpack.nim
new file mode 100644
index 000000000..27413a42b
--- /dev/null
+++ b/tests/errmsgs/tassignunpack.nim
@@ -0,0 +1,3 @@
+var a, b = 0
+(a, b) = 1 #[tt.Error
+         ^ type mismatch: got <int literal(1)> but expected 'tuple']#
diff --git a/tests/errmsgs/ttupleindexoutofbounds.nim b/tests/errmsgs/ttupleindexoutofbounds.nim
new file mode 100644
index 000000000..ae634dddb
--- /dev/null
+++ b/tests/errmsgs/ttupleindexoutofbounds.nim
@@ -0,0 +1,2 @@
+let a = (1, 2)[4] #[tt.Error
+              ^ invalid index 4 in subscript for tuple of length 2]#
diff --git a/tests/types/tassignemptytuple.nim b/tests/types/tassignemptytuple.nim
index 9d5a311ba..f3320dec7 100644
--- a/tests/types/tassignemptytuple.nim
+++ b/tests/types/tassignemptytuple.nim
@@ -1,5 +1,5 @@
 discard """
-  errormsg: "cannot infer the type of the tuple"
+  errormsg: "invalid type: 'empty' in this context: '(seq[empty], (seq[empty], set[empty]))' for let"
   file: "tassignemptytuple.nim"
   line: 11
 """