summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorTimothee Cour <timothee.cour2@gmail.com>2021-06-21 00:46:31 -0700
committerGitHub <noreply@github.com>2021-06-21 09:46:31 +0200
commitad70a65e0e3eda39a3ca074af9feadb68f10598f (patch)
tree9855af6bc9dffcbaa6f447203dadc6a42f8f4c17
parentabd21ef213b7368253050a18e5c4907d22992c8c (diff)
downloadNim-ad70a65e0e3eda39a3ca074af9feadb68f10598f.tar.gz
fix #18310 system.== in vm for NimNode (#18313)
* fix #18310 == in vm

* fixup

* fixup
-rw-r--r--compiler/vm.nim11
-rw-r--r--tests/vm/tvmmisc.nim11
2 files changed, 17 insertions, 5 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim
index b540ac071..837a1c366 100644
--- a/compiler/vm.nim
+++ b/compiler/vm.nim
@@ -10,14 +10,15 @@
 ## This file implements the new evaluation engine for Nim code.
 ## An instruction is 1-3 int32s in memory, it is a register based VM.
 
-import ast except getstr
 
 import
-  strutils, msgs, vmdef, vmgen, nimsets, types, passes,
-  parser, vmdeps, idents, trees, renderer, options, transf, parseutils,
-  vmmarshal, gorgeimpl, lineinfos, tables, btrees, macrocacheimpl,
+  std/[strutils, tables, parseutils],
+  msgs, vmdef, vmgen, nimsets, types, passes,
+  parser, vmdeps, idents, trees, renderer, options, transf,
+  vmmarshal, gorgeimpl, lineinfos, btrees, macrocacheimpl,
   modulegraphs, sighashes, int128, vmprofiler
 
+import ast except getstr
 from semfold import leValueConv, ordinalValToString
 from evaltempl import evalTemplate
 from magicsys import getSysType
@@ -1026,7 +1027,7 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
         let nc = regs[rc].node
         if nb.kind != nc.kind: discard
         elif (nb == nc) or (nb.kind == nkNilLit): ret = true # intentional
-        elif (nb.kind in {nkSym, nkTupleConstr, nkClosure} and nb.typ.kind == tyProc) and sameConstant(nb, nc):
+        elif nb.kind in {nkSym, nkTupleConstr, nkClosure} and nb.typ != nil and nb.typ.kind == tyProc and sameConstant(nb, nc):
           ret = true
           # this also takes care of procvar's, represented as nkTupleConstr, e.g. (nil, nil)
         elif nb.kind == nkIntLit and nc.kind == nkIntLit and nb.intVal == nc.intVal: # TODO: nkPtrLit
diff --git a/tests/vm/tvmmisc.nim b/tests/vm/tvmmisc.nim
index f0d2c2dbf..a4f6391cc 100644
--- a/tests/vm/tvmmisc.nim
+++ b/tests/vm/tvmmisc.nim
@@ -256,6 +256,17 @@ block:
   doAssert f == @[]
 
 
+block: # bug #18310
+  macro t() : untyped =
+    let
+      x = nnkTupleConstr.newTree(newLit(1))
+      y = nnkTupleConstr.newTree(newLit(2))
+    doAssert not (x == y) # not using != intentionally
+    doAssert not(cast[int](x) == cast[int](y))
+    doAssert not(system.`==`(x, y))
+    doAssert system.`==`(x, x)
+  t()
+
 block: # bug #10815
   type
     Opcode = enum