summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2015-09-13 23:26:44 +0200
committerAraq <rumpf_a@web.de>2015-09-13 23:26:44 +0200
commit14354b436f2cef462e50723b7624275212412cd1 (patch)
treed6c5dca49757e0ffa91921443dae58d6ae2c6b47
parente01e0a4b4056ac4a42797bab9f10822ae8996607 (diff)
downloadNim-14354b436f2cef462e50723b7624275212412cd1.tar.gz
fixes #2599
-rw-r--r--compiler/semfold.nim9
-rw-r--r--compiler/sigmatch.nim5
-rw-r--r--tests/generics/mbind_bracket.nim17
-rw-r--r--tests/generics/tbind_bracket.nim20
-rw-r--r--tests/generics/tthread_generic.nim2
5 files changed, 40 insertions, 13 deletions
diff --git a/compiler/semfold.nim b/compiler/semfold.nim
index 70276a6d4..5fe4e3299 100644
--- a/compiler/semfold.nim
+++ b/compiler/semfold.nim
@@ -430,17 +430,10 @@ proc evalOp(m: TMagic, n, a, b, c: PNode): PNode =
   of mCompileOptionArg:
     result = newIntNodeT(ord(
       testCompileOptionArg(getStr(a), getStr(b), n.info)), n)
-  of mNewString, mNewStringOfCap,
-     mExit, mInc, ast.mDec, mEcho, mSwap, mAppendStrCh,
-     mAppendStrStr, mAppendSeqElem, mSetLengthStr, mSetLengthSeq,
-     mParseExprToAst, mParseStmtToAst, mExpandToAst, mTypeTrait, mDotDot,
-     mNLen..mNError, mEqRef, mSlurp, mStaticExec, mNGenSym, mSpawn,
-     mParallel, mPlugin, mGetTypeInfo, mTypeOf:
-    discard
   of mEqProc:
     result = newIntNodeT(ord(
         exprStructuralEquivalent(a, b, strictSymEquality=true)), n)
-  else: internalError(a.info, "evalOp(" & $m & ')')
+  else: discard
 
 proc getConstIfExpr(c: PSym, n: PNode): PNode =
   result = nil
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim
index b25f40c50..f6f029936 100644
--- a/compiler/sigmatch.nim
+++ b/compiler/sigmatch.nim
@@ -265,9 +265,6 @@ proc describeArgs*(c: PContext, n: PNode, startIdx = 1;
 
 proc typeRel*(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation
 proc concreteType(c: TCandidate, t: PType): PType =
-  # currently `[]=` is defined rather sloppily in system.nim, so we have
-  # a special type matching rule for it:
-  if c.calleeSym != nil and c.calleeSym.magic == mArrPut: return t
   case t.kind
   of tyArrayConstr:
     # make it an array
@@ -1694,7 +1691,7 @@ proc partialMatch*(c: PContext, n, nOrig: PNode, m: var TCandidate) =
   matchesAux(c, n, nOrig, m, marker)
 
 proc matches*(c: PContext, n, nOrig: PNode, m: var TCandidate) =
-  if m.calleeSym != nil and m.calleeSym.magic == mArrGet:
+  if m.calleeSym != nil and m.calleeSym.magic in {mArrGet, mArrPut}:
     m.state = csMatch
     m.call = n
     return
diff --git a/tests/generics/mbind_bracket.nim b/tests/generics/mbind_bracket.nim
new file mode 100644
index 000000000..4bf18b471
--- /dev/null
+++ b/tests/generics/mbind_bracket.nim
@@ -0,0 +1,17 @@
+
+import tables
+
+type
+  UUIDObject* = ref object
+    uuid: string
+
+  Registry*[T] = ref object
+    objects: Table[string, T]
+
+proc newRegistry*[T](): Registry[T] =
+  result = Registry[T]()
+  result.objects = initTable[string, T](128)
+
+proc register*[T](self: Registry[T], obj: T) =
+  self.objects[obj.uuid] = obj
+
diff --git a/tests/generics/tbind_bracket.nim b/tests/generics/tbind_bracket.nim
new file mode 100644
index 000000000..d0c5e2c6b
--- /dev/null
+++ b/tests/generics/tbind_bracket.nim
@@ -0,0 +1,20 @@
+discard """
+  output: "317"
+"""
+
+# bug #2599
+
+import mbind_bracket
+
+# also test that `[]` can be passed now as a first class construct:
+
+template takeBracket(x, a, i: untyped) =
+  echo x(a, i)
+
+var a: array[10, int]
+a[8] = 317
+
+takeBracket(`[]`, a, 8)
+
+let reg = newRegistry[UUIDObject]()
+reg.register(UUIDObject())
diff --git a/tests/generics/tthread_generic.nim b/tests/generics/tthread_generic.nim
index d34b24628..e8946caf6 100644
--- a/tests/generics/tthread_generic.nim
+++ b/tests/generics/tthread_generic.nim
@@ -3,7 +3,7 @@ discard """
 """
 
 type
-  TThreadFuncArgs[T] = object of TObject
+  TThreadFuncArgs[T] = object of RootObj
     a: proc(): T {.thread.}
     b: proc(val: T) {.thread.}