summary refs log tree commit diff stats
path: root/compiler/semstmts.nim
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2015-09-18 01:37:34 +0200
committerAraq <rumpf_a@web.de>2015-09-18 02:24:12 +0200
commit36f68e1650f5d9ebfe563b7411879dd46055ac69 (patch)
tree0e3037f623b343edbb692651c9fbcf1bfc6bb7f7 /compiler/semstmts.nim
parent432884861efee9742722243d548d6a48f09c38e6 (diff)
downloadNim-36f68e1650f5d9ebfe563b7411879dd46055ac69.tar.gz
fixes #3329
Diffstat (limited to 'compiler/semstmts.nim')
-rw-r--r--compiler/semstmts.nim26
1 files changed, 17 insertions, 9 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index f67ee2822..adb1c81c1 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -957,27 +957,35 @@ proc semDo(c: PContext, n: PNode, flags: TExprFlags): PNode =
 proc semInferredLambda(c: PContext, pt: TIdTable, n: PNode): PNode =
   var n = n
 
-  n = replaceTypesInBody(c, pt, n)
-  result = n
+  let original = n.sons[namePos].sym
+  let s = copySym(original, false)
+  incl(s.flags, sfFromGeneric)
 
+  n = replaceTypesInBody(c, pt, n, original)
+  result = n
+  s.ast = result
+  n.sons[namePos].sym = s
   n.sons[genericParamsPos] = emptyNode
-  n.sons[paramsPos] = n.typ.n
-
+  let params = n.typ.n
+  n.sons[paramsPos] = params
+  s.typ = n.typ
+  for i in 1..<params.len:
+    if params[i].typ.kind in {tyTypeDesc, tyGenericParam,
+                              tyFromExpr, tyFieldAccessor}+tyTypeClasses:
+      localError(params[i].info, "cannot infer type of parameter: " &
+                 params[i].sym.name.s)
   openScope(c)
-  var s = n.sons[namePos].sym
   pushOwner(s)
-  addParams(c, n.typ.n, skProc)
+  addParams(c, params, 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)
+  n.sons[bodyPos] = transformBody(c.module, semBody, s)
   popProcCon(c)
   popOwner()
   closeScope(c)
 
-  s.ast = result
-
   # alternative variant (not quite working):
   # var prc = arg[0].sym
   # let inferred = c.semGenerateInstance(c, prc, m.bindings, arg.info)