diff options
author | Araq <rumpf_a@web.de> | 2015-04-24 20:28:39 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2015-04-25 23:16:58 +0200 |
commit | 2c91e999e29208f89ab6b0995b6942b69a1e23e3 (patch) | |
tree | ad57e2df4e51328913e6c1c5d8b70d7d592784e7 | |
parent | ecc009093933887ab692efd5db099d752a1d2e6b (diff) | |
download | Nim-2c91e999e29208f89ab6b0995b6942b69a1e23e3.tar.gz |
fixes #2600
-rw-r--r-- | compiler/sigmatch.nim | 10 | ||||
-rw-r--r-- | tests/overload/tspec.nim | 31 | ||||
-rw-r--r-- | web/question.txt | 29 |
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 |