diff options
author | Araq <rumpf_a@web.de> | 2013-01-08 20:03:02 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2013-01-08 20:03:02 +0100 |
commit | 3af5c99336c2454aee1d853fa7fcbbf3ce16d568 (patch) | |
tree | 6107dbd4fd30530579f39d798e3df63cccd33a3c /compiler | |
parent | e6fc044107c580c056069f1a3638006e83f1360e (diff) | |
download | Nim-3af5c99336c2454aee1d853fa7fcbbf3ce16d568.tar.gz |
fixes #293
Diffstat (limited to 'compiler')
-rwxr-xr-x | compiler/ast.nim | 2 | ||||
-rwxr-xr-x | compiler/evals.nim | 4 | ||||
-rwxr-xr-x | compiler/msgs.nim | 2 | ||||
-rwxr-xr-x | compiler/renderer.nim | 7 | ||||
-rwxr-xr-x | compiler/semstmts.nim | 25 | ||||
-rwxr-xr-x | compiler/semthreads.nim | 2 |
6 files changed, 29 insertions, 13 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim index 82a20c312..fc21235bc 100755 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -1,7 +1,7 @@ # # # The Nimrod Compiler -# (c) Copyright 2012 Andreas Rumpf +# (c) Copyright 2013 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. diff --git a/compiler/evals.nim b/compiler/evals.nim index 5623f7955..4b42f5ada 100755 --- a/compiler/evals.nim +++ b/compiler/evals.nim @@ -1,7 +1,7 @@ # # # The Nimrod Compiler -# (c) Copyright 2012 Andreas Rumpf +# (c) Copyright 2013 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -319,7 +319,7 @@ proc evalVar(c: PEvalContext, n: PNode): PNode = else: if x.kind notin {nkEmpty..nkNilLit}: discardSons(x) - for i in countup(0, sonsLen(result) - 1): addSon(x, result.sons[i]) + for j in countup(0, sonsLen(result) - 1): addSon(x, result.sons[j]) result = emptyNode proc aliasNeeded(n: PNode, flags: TEvalFlags): bool = diff --git a/compiler/msgs.nim b/compiler/msgs.nim index 16603a9a8..9858b1b9e 100755 --- a/compiler/msgs.nim +++ b/compiler/msgs.nim @@ -1,7 +1,7 @@ # # # The Nimrod Compiler -# (c) Copyright 2012 Andreas Rumpf +# (c) Copyright 2013 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. diff --git a/compiler/renderer.nim b/compiler/renderer.nim index c8ee66e03..48a190ec1 100755 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -1,7 +1,7 @@ # # # The Nimrod Compiler -# (c) Copyright 2012 Andreas Rumpf +# (c) Copyright 2013 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -753,8 +753,7 @@ proc doParamsAux(g: var TSrcGen, params: PNode) = proc gsub(g: var TSrcGen, n: PNode, c: TContext) = if isNil(n): return - var - L: int + var a: TContext if n.comment != nil: pushCom(g, n) case n.kind # atoms: @@ -1096,7 +1095,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = incl(a.flags, rfInConstExpr) gsection(g, n, a, tkConst, "const") of nkVarSection, nkLetSection: - L = sonsLen(n) + var L = sonsLen(n) if L == 0: return if n.kind == nkVarSection: putWithSpace(g, tkVar, "var") else: putWithSpace(g, tkLet, "let") diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index d78112ee5..c86e3eb91 100755 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -172,11 +172,16 @@ proc fitRemoveHiddenConv(c: PContext, typ: Ptype, n: PNode): PNode = changeType(result, typ) proc findShadowedVar(c: PContext, v: PSym): PSym = - for i in countdown(c.tab.tos - 2, 0): + for i in countdown(c.tab.tos - 2, ModuleTablePos+1): let shadowed = StrTableGet(c.tab.stack[i], v.name) if shadowed != nil and shadowed.kind in skLocalVars: return shadowed +proc identWithin(n: PNode, s: PIdent): bool = + for i in 0 .. n.safeLen-1: + if identWithin(n.sons[i], s): return true + result = n.kind == nkSym and n.sym.name.id == s.id + proc semIdentDef(c: PContext, n: PNode, kind: TSymKind): PSym = if isTopLevel(c): result = semIdentWithPragma(c, kind, n, {sfExported}) @@ -239,7 +244,10 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode = let shadowed = findShadowedVar(c, v) if shadowed != nil: shadowed.flags.incl(sfShadowed) - Message(a.info, warnShadowIdent, v.name.s) + # a shadowed variable is an error unless it appears on the right + # side of the '=': + if warnShadowIdent in gNotes and not identWithin(def, v.name): + Message(a.info, warnShadowIdent, v.name.s) if def != nil and def.kind != nkEmpty: # this is only needed for the evaluation pass: v.ast = def @@ -368,6 +376,15 @@ proc semForFields(c: PContext, n: PNode, m: TMagic): PNode = b.add(ast.emptyNode) stmts.add(b) +proc addForVarDecl(c: PContext, v: PSym) = + if warnShadowIdent in gNotes: + let shadowed = findShadowedVar(c, v) + if shadowed != nil: + # XXX should we do this here? + #shadowed.flags.incl(sfShadowed) + Message(v.info, warnShadowIdent, v.name.s) + addDecl(c, v) + proc semForVars(c: PContext, n: PNode): PNode = result = n var length = sonsLen(n) @@ -383,7 +400,7 @@ proc semForVars(c: PContext, n: PNode): PNode = # for an example: v.typ = n.sons[length-2].typ n.sons[0] = newSymNode(v) - if sfGenSym notin v.flags: addDecl(c, v) + if sfGenSym notin v.flags: addForVarDecl(c, v) else: LocalError(n.info, errWrongNumberOfVariables) elif length-2 != sonsLen(iter): @@ -394,7 +411,7 @@ proc semForVars(c: PContext, n: PNode): PNode = if getCurrOwner().kind == skModule: incl(v.flags, sfGlobal) v.typ = iter.sons[i] n.sons[i] = newSymNode(v) - if sfGenSym notin v.flags: addDecl(c, v) + if sfGenSym notin v.flags: addForVarDecl(c, v) Inc(c.p.nestedLoopCounter) n.sons[length-1] = SemStmt(c, n.sons[length-1]) Dec(c.p.nestedLoopCounter) diff --git a/compiler/semthreads.nim b/compiler/semthreads.nim index 75621be79..9fc6a54d9 100755 --- a/compiler/semthreads.nim +++ b/compiler/semthreads.nim @@ -1,7 +1,7 @@ # # # The Nimrod Compiler -# (c) Copyright 2012 Andreas Rumpf +# (c) Copyright 2013 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. |