diff options
author | Araq <rumpf_a@web.de> | 2015-09-18 01:37:34 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2015-09-18 02:24:12 +0200 |
commit | 36f68e1650f5d9ebfe563b7411879dd46055ac69 (patch) | |
tree | 0e3037f623b343edbb692651c9fbcf1bfc6bb7f7 /compiler/semstmts.nim | |
parent | 432884861efee9742722243d548d6a48f09c38e6 (diff) | |
download | Nim-36f68e1650f5d9ebfe563b7411879dd46055ac69.tar.gz |
fixes #3329
Diffstat (limited to 'compiler/semstmts.nim')
-rw-r--r-- | compiler/semstmts.nim | 26 |
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) |