summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2015-04-24 20:28:39 +0200
committerAraq <rumpf_a@web.de>2015-04-25 23:16:58 +0200
commit2c91e999e29208f89ab6b0995b6942b69a1e23e3 (patch)
treead57e2df4e51328913e6c1c5d8b70d7d592784e7
parentecc009093933887ab692efd5db099d752a1d2e6b (diff)
downloadNim-2c91e999e29208f89ab6b0995b6942b69a1e23e3.tar.gz
fixes #2600
-rw-r--r--compiler/sigmatch.nim10
-rw-r--r--tests/overload/tspec.nim31
-rw-r--r--web/question.txt29
3 files changed, 50 insertions, 20 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim
index 5c8a3bc58..aad6b590e 100644
--- a/compiler/sigmatch.nim
+++ b/compiler/sigmatch.nim
@@ -147,6 +147,7 @@ proc copyCandidate(a: var TCandidate, b: TCandidate) =
 
 proc sumGeneric(t: PType): int =
   var t = t
+  var isvar = 1
   while true:
     case t.kind
     of tyGenericInst, tyArray, tyRef, tyPtr, tyDistinct, tyArrayConstr,
@@ -154,8 +155,9 @@ proc sumGeneric(t: PType): int =
       t = t.lastSon
       inc result
     of tyVar:
-      # but do not make 'var T' more specific than 'T'!
       t = t.sons[0]
+      inc result
+      inc isvar
     of tyGenericInvocation, tyTuple:
       result = ord(t.kind == tyGenericInvocation)
       for i in 0 .. <t.len: result += t.sons[i].sumGeneric
@@ -164,7 +166,7 @@ proc sumGeneric(t: PType): int =
     of tyBool, tyChar, tyEnum, tyObject, tyProc, tyPointer,
         tyString, tyCString, tyInt..tyInt64, tyFloat..tyFloat128,
         tyUInt..tyUInt64:
-      return 1
+      return isvar
     else: return 0
 
 #var ggDebug: bool
@@ -1470,9 +1472,7 @@ proc matchesAux(c: PContext, n, nOrig: PNode,
         m.state = csNoMatch
         return
     if formal.typ.kind == tyVar:
-      if n.isLValue:
-        inc(m.genericMatches, 100)
-      else:
+      if not n.isLValue:
         m.state = csNoMatch
         return
 
diff --git a/tests/overload/tspec.nim b/tests/overload/tspec.nim
index 685df503a..99966e93e 100644
--- a/tests/overload/tspec.nim
+++ b/tests/overload/tspec.nim
@@ -11,7 +11,8 @@ ref T
 123
 2
 1
-@[123, 2, 1]'''
+@[123, 2, 1]
+Called!'''
 """
 
 # Things that's even in the spec now!
@@ -79,3 +80,31 @@ proc takeV[T](a: varargs[T]) =
 
 takeV([123, 2, 1]) # takeV's T is "int", not "array of int"
 echo(@[123, 2, 1])
+
+# bug #2600
+
+type
+  FutureBase* = ref object of RootObj ## Untyped future.
+
+  Future*[T] = ref object of FutureBase ## Typed future.
+    value: T ## Stored value
+
+  FutureVar*[T] = distinct Future[T]
+
+proc newFuture*[T](): Future[T] =
+  new(result)
+
+proc newFutureVar*[T](): FutureVar[T] =
+  result = FutureVar[T](newFuture[T]())
+
+proc mget*[T](future: FutureVar[T]): var T =
+  Future[T](future).value
+
+proc reset*[T](future: FutureVar[T]) =
+  echo "Called!"
+
+when true:
+  var foo = newFutureVar[string]()
+  foo.mget() = ""
+  foo.mget.add("Foobar")
+  foo.reset()
diff --git a/web/question.txt b/web/question.txt
index 0733a2455..c4d997922 100644
--- a/web/question.txt
+++ b/web/question.txt
@@ -16,11 +16,11 @@ General FAQ
   language that tries to give the programmer ultimate power without compromises
   on runtime efficiency.
   This means it focuses on compile-time mechanisms in all their
-  various forms. Beneath a nice infix/indentation based syntax with a 
-  powerful (AST based, hygienic) macro system lies a semantic model that supports 
-  a soft realtime GC on thread local heaps. Asynchronous message passing is used 
-  between threads, so no "stop the world" mechanism is necessary. An unsafe 
-  shared memory heap is also provided for the increased efficiency that results 
+  various forms. Beneath a nice infix/indentation based syntax with a
+  powerful (AST based, hygienic) macro system lies a semantic model that supports
+  a soft realtime GC on thread local heaps. Asynchronous message passing is used
+  between threads, so no "stop the world" mechanism is necessary. An unsafe
+  shared memory heap is also provided for the increased efficiency that results
   from that model.
 
 
@@ -29,8 +29,8 @@ General FAQ
   Why yet another programming language?
   -------------------------------------
 
-  Nim is one of the very few *programmable* statically typed languages, and 
-  one of the even fewer that produces native binaries that require no 
+  Nim is one of the very few *programmable* statically typed languages, and
+  one of the even fewer that produces native binaries that require no
   runtime or interpreter.
 
 
@@ -48,12 +48,12 @@ General FAQ
   What is Nim's take on concurrency?
   ----------------------------------
 
-  Nim primarily focusses on thread local (and garbage collected) heaps and 
-  message passing between threads. Each thread has its own GC, so no 
+  Nim primarily focusses on thread local (and garbage collected) heaps and
+  message passing between threads. Each thread has its own GC, so no
   "stop the world" mechanism is necessary. An unsafe shared memory heap is also
   provided.
 
-  Future versions will additionally include a GC "per thread group" 
+  Future versions will additionally include a GC "per thread group"
   and Nim's type system will be enhanced to accurately model this shared
   memory heap.
 
@@ -74,7 +74,7 @@ General FAQ
   ------------------
 
   The compiler is in development and some important features are still missing.
-  However, the compiler is quite stable already: It is able to compile itself 
+  However, the compiler is quite stable already: It is able to compile itself
   and a substantial body of other code. Until version 1.0.0 is released,
   minor incompatibilities with older versions of the compiler will be introduced.
 
@@ -83,9 +83,9 @@ General FAQ
 
   How fast is Nim?
   ----------------
-  Benchmarks show it to be comparable to C. Some language features (methods, 
+  Benchmarks show it to be comparable to C. Some language features (methods,
   closures, message passing) are not yet as optimized as they could and will be.
-  The only overhead Nim has over C is the GC which has been tuned 
+  The only overhead Nim has over C is the GC which has been tuned
   for years but still needs some work.
 
 
@@ -96,7 +96,7 @@ General FAQ
 
   A JVM backend is almost impossible. The JVM is not expressive enough. It has
   never been designed as a general purpose VM anyway. A CLR backend is possible
-  but would require much work. 
+  but would require much work.
 
 
 .. container:: standout
@@ -112,6 +112,7 @@ General FAQ
   - jEdit: https://github.com/exhu/nimrod-misc/tree/master/jedit
   - TextMate: Available in bundle installer (`Repository <https://github.com/textmate/nim.tmbundle>`_)
   - Sublime Text: Available via Package Control (`Repository <https://github.com/Varriount/NimLime>`_)
+  - LiClipse: http://www.liclipse.com/ (Eclipse based plugin)
 
 
 .. container:: standout