summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2015-02-08 14:15:02 +0100
committerAraq <rumpf_a@web.de>2015-02-08 14:15:02 +0100
commitada0f14711d3eff140f05f8a845cff5d489a71fd (patch)
treee3337ea1f321cbcfef6f72c5689bb634000a4771
parentc91ca82a43917163f00cf86e59d80a8909dca80a (diff)
downloadNim-ada0f14711d3eff140f05f8a845cff5d489a71fd.tar.gz
fixes #2073
-rw-r--r--compiler/semstmts.nim4
-rw-r--r--lib/system.nim2
-rw-r--r--tests/closure/ttimeinfo.nim15
-rw-r--r--web/news.txt3
4 files changed, 20 insertions, 4 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index b4790e421..6e5b272de 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -825,9 +825,9 @@ proc semLambda(c: PContext, n: PNode, flags: TExprFlags): PNode =
     if gp.len == 0 or (gp.len == 1 and tfRetType in gp[0].typ.flags):
       pushProcCon(c, s)
       addResult(c, s.typ.sons[0], n.info, skProc)
+      addResultNode(c, n)
       let semBody = hloBody(c, semProcBody(c, n.sons[bodyPos]))
       n.sons[bodyPos] = transformBody(c.module, semBody, s)
-      addResultNode(c, n)
       popProcCon(c)
     elif efOperand notin flags:
       localError(n.info, errGenericLambdaNotAllowed)
@@ -860,9 +860,9 @@ proc semInferredLambda(c: PContext, pt: TIdTable, n: PNode): PNode =
   addParams(c, n.typ.n, skProc)
   pushProcCon(c, s)
   addResult(c, n.typ.sons[0], n.info, skProc)
+  addResultNode(c, n)
   let semBody = hloBody(c, semProcBody(c, n.sons[bodyPos]))
   n.sons[bodyPos] = transformBody(c.module, semBody, n.sons[namePos].sym)
-  addResultNode(c, n)
   popProcCon(c)
   popOwner()
   closeScope(c)
diff --git a/lib/system.nim b/lib/system.nim
index 19836b68c..ef70a2672 100644
--- a/lib/system.nim
+++ b/lib/system.nim
@@ -3161,7 +3161,7 @@ when hostOS != "standalone":
       x[j+i] = item[j]
       inc(j)
 
-proc compiles*(x): bool {.magic: "Compiles", noSideEffect.} =
+proc compiles*(x: expr): bool {.magic: "Compiles", noSideEffect.} =
   ## Special compile-time procedure that checks whether `x` can be compiled
   ## without any semantic error.
   ## This can be used to check whether a type supports some operation:
diff --git a/tests/closure/ttimeinfo.nim b/tests/closure/ttimeinfo.nim
new file mode 100644
index 000000000..3138ae72e
--- /dev/null
+++ b/tests/closure/ttimeinfo.nim
@@ -0,0 +1,15 @@
+# bug #2073
+
+import sequtils
+import times
+
+# 1
+proc f(n: int): TimeInfo =
+  TimeInfo(year: n, month: mJan, monthday: 1)
+
+echo toSeq(2000 || 2015).map(f)
+
+# 2
+echo toSeq(2000 || 2015).map(proc (n: int): TimeInfo =
+  TimeInfo(year: n, month: mJan, monthday: 1)
+)
diff --git a/web/news.txt b/web/news.txt
index f765479a2..4c97c5f9b 100644
--- a/web/news.txt
+++ b/web/news.txt
@@ -21,7 +21,8 @@ News
     should be used instead.
   - ``nim idetools`` has been replaced by a separate tool `nimsuggest`_.
   - *arrow like* operators are not right associative anymore.
-
+  - Typeless parameters are now only allowed in templates and macros. The old
+    way turned out to be too error-prone.
   
   Language Additions
   ------------------