summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2011-12-31 18:15:20 +0100
committerAraq <rumpf_a@web.de>2011-12-31 18:15:20 +0100
commit0d8e6dda69ed4a63e12b95ee1cba37bab31f56ab (patch)
treeb7b29b13183f045218f129d5117d38300d6da3d2
parent8c993733b953fbb84fc7d97546eae7d3f9564ed7 (diff)
downloadNim-0d8e6dda69ed4a63e12b95ee1cba37bab31f56ab.tar.gz
new len(openarray) implementation
-rwxr-xr-xcompiler/semstmts.nim2
-rwxr-xr-xcompiler/semtypes.nim11
-rwxr-xr-xlib/system.nim5
-rw-r--r--tests/reject/tnolen.nim9
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)
+