summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/cgen.nim4
-rw-r--r--tests/ccgbugs/tresult_of_array.nim29
2 files changed, 32 insertions, 1 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index 8b3da223f..57a0f0679 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -317,8 +317,10 @@ proc resetLoc(p: BProc, loc: var TLoc) =
       genObjectInit(p, cpsStmts, loc.t, loc, true)
     else:
       useStringh(p.module)
+      # array passed as argument decayed into pointer, bug #7332
+      # so we use getTypeDesc here rather than rdLoc(loc)
       linefmt(p, cpsStmts, "memset((void*)$1, 0, sizeof($2));$n",
-              addrLoc(loc), rdLoc(loc))
+              addrLoc(loc), getTypeDesc(p.module, loc.t))
       # XXX: We can be extra clever here and call memset only
       # on the bytes following the m_type field?
       genObjectInit(p, cpsStmts, loc.t, loc, true)
diff --git a/tests/ccgbugs/tresult_of_array.nim b/tests/ccgbugs/tresult_of_array.nim
new file mode 100644
index 000000000..fb5abf18a
--- /dev/null
+++ b/tests/ccgbugs/tresult_of_array.nim
@@ -0,0 +1,29 @@
+discard """
+  output: '''false
+true
+false
+[false, false, false]
+'''
+"""
+
+# bug #7332
+# resetLoc generate incorrect memset code
+# because of array passed as argument decaying into a pointer
+
+import tables
+const tableOfArray = {
+    "one": [true, false, false],
+    "two": [false, true, false],
+    "three": [false, false, true]
+}.toTable()
+for i in 0..2:
+    echo tableOfArray["two"][i]
+
+var seqOfArray = @[
+    [true, false, false],
+    [false, true, false],
+    [false, false, true]
+]
+proc crashingProc*[B](t: seq[B], index: Natural): B =
+    discard
+echo seqOfArray.crashingProc(0)