diff options
author | Araq <rumpf_a@web.de> | 2015-09-13 23:26:44 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2015-09-13 23:26:44 +0200 |
commit | 14354b436f2cef462e50723b7624275212412cd1 (patch) | |
tree | d6c5dca49757e0ffa91921443dae58d6ae2c6b47 | |
parent | e01e0a4b4056ac4a42797bab9f10822ae8996607 (diff) | |
download | Nim-14354b436f2cef462e50723b7624275212412cd1.tar.gz |
fixes #2599
-rw-r--r-- | compiler/semfold.nim | 9 | ||||
-rw-r--r-- | compiler/sigmatch.nim | 5 | ||||
-rw-r--r-- | tests/generics/mbind_bracket.nim | 17 | ||||
-rw-r--r-- | tests/generics/tbind_bracket.nim | 20 | ||||
-rw-r--r-- | tests/generics/tthread_generic.nim | 2 |
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.} |