diff options
author | Araq <rumpf_a@web.de> | 2011-12-31 18:15:20 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2011-12-31 18:15:20 +0100 |
commit | 0d8e6dda69ed4a63e12b95ee1cba37bab31f56ab (patch) | |
tree | b7b29b13183f045218f129d5117d38300d6da3d2 | |
parent | 8c993733b953fbb84fc7d97546eae7d3f9564ed7 (diff) | |
download | Nim-0d8e6dda69ed4a63e12b95ee1cba37bab31f56ab.tar.gz |
new len(openarray) implementation
-rwxr-xr-x | compiler/semstmts.nim | 2 | ||||
-rwxr-xr-x | compiler/semtypes.nim | 11 | ||||
-rwxr-xr-x | lib/system.nim | 5 | ||||
-rw-r--r-- | tests/reject/tnolen.nim | 9 |
4 files changed, 22 insertions, 5 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index d8336fc94..cbe32cea5 100755 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -512,7 +512,7 @@ proc typeSectionRightSidePass(c: PContext, n: PNode) = # symbol lookup needs to be done here. openScope(c.tab) pushOwner(s) - s.typ.kind = tyGenericBody + if s.magic == mNone: s.typ.kind = tyGenericBody if s.typ.containerID != 0: InternalError(a.info, "semTypeSection: containerID") s.typ.containerID = s.typ.id diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index b71f230eb..f106812f3 100755 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -760,7 +760,12 @@ proc processMagicType(c: PContext, m: PSym) = of mStmt: setMagicType(m, tyStmt, 0) of mTypeDesc: setMagicType(m, tyTypeDesc, 0) of mVoidType: setMagicType(m, tyEmpty, 0) - of mArray, mOpenArray, mRange, mSet, mSeq, mOrdinal: nil + of mArray: setMagicType(m, tyArray, 0) + of mOpenArray: setMagicType(m, tyOpenArray, 0) + of mRange: setMagicType(m, tyRange, 0) + of mSet: setMagicType(m, tySet, 0) + of mSeq: setMagicType(m, tySequence, 0) + of mOrdinal: nil else: GlobalError(m.info, errTypeExpected) proc newConstraint(c: PContext, k: TTypeKind): PType = @@ -782,9 +787,9 @@ proc semGenericConstraints(c: PContext, n: PNode, result: PType) = semGenericConstraints(c, n.sons[2], result) else: var x = semTypeNode(c, n, nil) - if x.kind in StructuralEquivTypes and sonsLen(x) == 0: + if x.kind in StructuralEquivTypes and ( + sonsLen(x) == 0 or x.sons[0].kind == tyEmpty): x = newConstraint(c, x.kind) - #echo "came here for: ", typeToString(x) result.addSon(x) proc semGenericParamList(c: PContext, n: PNode, father: PType = nil): PNode = diff --git a/lib/system.nim b/lib/system.nim index 1161adaf6..c553313de 100755 --- a/lib/system.nim +++ b/lib/system.nim @@ -309,7 +309,10 @@ proc newSeq*[T](s: var seq[T], len: int) {.magic: "NewSeq", noSideEffect.} ## This is equivalent to ``s = @[]; setlen(s, len)``, but more ## efficient since no reallocation is needed. -proc len*[T](x: openArray[T]): int {.magic: "LengthOpenArray", noSideEffect.} +when defined(newOpenArrayLen): + proc len*[T: openArray](x: T): int {.magic: "LengthOpenArray", noSideEffect.} +else: + proc len*[T](x: openArray[T]): int {.magic: "LengthOpenArray", noSideEffect.} proc len*(x: string): int {.magic: "LengthStr", noSideEffect.} proc len*(x: cstring): int {.magic: "LengthStr", noSideEffect.} proc len*[I, T](x: array[I, T]): int {.magic: "LengthArray", noSideEffect.} diff --git a/tests/reject/tnolen.nim b/tests/reject/tnolen.nim new file mode 100644 index 000000000..5bb1d6c82 --- /dev/null +++ b/tests/reject/tnolen.nim @@ -0,0 +1,9 @@ +discard """ + line: 8 + msg: "Error: type mismatch: got (int)" +""" + +# please finally disallow Len(3) + +echo len(3) + |