diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2015-03-08 14:49:49 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2015-03-08 14:49:49 +0100 |
commit | 38b9093581819cc37c7b92185ce2134e27f0c18f (patch) | |
tree | 851f760567706a2816dc45dce549ca7dee95e91c | |
parent | 419199bf9ae507c104d497e1714ceedf300dc38e (diff) | |
parent | 4d8e0d54c351b9338e9ebfa7738064be97167322 (diff) | |
download | Nim-38b9093581819cc37c7b92185ce2134e27f0c18f.tar.gz |
Merge pull request #2274 from reactormonk/warning-for-result
Warning for result
-rw-r--r-- | compiler/msgs.nim | 8 | ||||
-rw-r--r-- | compiler/semstmts.nim | 3 | ||||
-rw-r--r-- | tests/exprs/tresultwarning.nim | 6 |
3 files changed, 14 insertions, 3 deletions
diff --git a/compiler/msgs.nim b/compiler/msgs.nim index e15cdc86d..4ea67989a 100644 --- a/compiler/msgs.nim +++ b/compiler/msgs.nim @@ -117,7 +117,8 @@ type warnDifferentHeaps, warnWriteToForeignHeap, warnUnsafeCode, warnEachIdentIsTuple, warnShadowIdent, warnProveInit, warnProveField, warnProveIndex, warnGcUnsafe, warnGcUnsafe2, - warnUninit, warnGcMem, warnDestructor, warnLockLevel, warnUser, + warnUninit, warnGcMem, warnDestructor, warnLockLevel, warnResultShadowed, + warnUser, hintSuccess, hintSuccessX, hintLineTooLong, hintXDeclaredButNotUsed, hintConvToBaseNotNeeded, hintConvFromXtoItselfNotNeeded, hintExprAlwaysX, hintQuitCalled, @@ -391,6 +392,7 @@ const warnGcMem: "'$1' uses GC'ed memory [GcMem]", warnDestructor: "usage of a type with a destructor in a non destructible context. This will become a compile time error in the future. [Destructor]", warnLockLevel: "$1 [LockLevel]", + warnResultShadowed: "Special variable 'result' is shadowed. [ResultShadowed]", warnUser: "$1 [User]", hintSuccess: "operation successful [Success]", hintSuccessX: "operation successful ($# lines compiled; $# sec total; $#) [SuccessX]", @@ -411,7 +413,7 @@ const hintUser: "$1 [User]"] const - WarningsToStr*: array[0..29, string] = ["CannotOpenFile", "OctalEscape", + WarningsToStr*: array[0..30, string] = ["CannotOpenFile", "OctalEscape", "XIsNeverRead", "XmightNotBeenInit", "Deprecated", "ConfigDeprecated", "SmallLshouldNotBeUsed", "UnknownMagic", @@ -421,7 +423,7 @@ const "TypelessParam", "DifferentHeaps", "WriteToForeignHeap", "UnsafeCode", "EachIdentIsTuple", "ShadowIdent", "ProveInit", "ProveField", "ProveIndex", "GcUnsafe", "GcUnsafe2", "Uninit", - "GcMem", "Destructor", "LockLevel", "User"] + "GcMem", "Destructor", "LockLevel", "ResultShadowed", "User"] HintsToStr*: array[0..16, string] = ["Success", "SuccessX", "LineTooLong", "XDeclaredButNotUsed", "ConvToBaseNotNeeded", "ConvFromXtoItselfNotNeeded", diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index ccfd74607..374302165 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -400,6 +400,7 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode = elif tup.kind == tyTuple and def.kind == nkPar and a.kind == nkIdentDefs and a.len > 3: message(a.info, warnEachIdentIsTuple) + for j in countup(0, length-3): var v = semIdentDef(c, a.sons[j], symkind) if sfGenSym notin v.flags: addInterfaceDecl(c, v) @@ -409,6 +410,8 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode = let shadowed = findShadowedVar(c, v) if shadowed != nil: shadowed.flags.incl(sfShadowed) + if shadowed.kind == skResult: + message(a.info, warnResultShadowed) # 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): diff --git a/tests/exprs/tresultwarning.nim b/tests/exprs/tresultwarning.nim new file mode 100644 index 000000000..32934408e --- /dev/null +++ b/tests/exprs/tresultwarning.nim @@ -0,0 +1,6 @@ +discard """ + nimout: "Special variable 'result' is shadowed. [ResultShadowed]" +""" + +proc test(): string = + var result = "foo" |