From a1d813d12cf04207a07e27e20751d5db053bb029 Mon Sep 17 00:00:00 2001 From: Simon Hafner Date: Sun, 1 Feb 2015 05:28:35 -0600 Subject: [PATCH 1/5] added a warning for when result is shadowed #868 --- compiler/msgs.nim | 4 +++- compiler/semstmts.nim | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/compiler/msgs.nim b/compiler/msgs.nim index 35a1217692..e78414804e 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]", diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 3fe3e40f09..e50a80bcfb 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -396,6 +396,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) @@ -405,6 +406,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): From f592240c545506448e2bea78a2fa3404c7f46e69 Mon Sep 17 00:00:00 2001 From: Simon Hafner Date: Thu, 5 Mar 2015 14:44:50 -0600 Subject: [PATCH 2/5] added test for result shadow warning --- tests/exprs/tresultwarning.nim | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 tests/exprs/tresultwarning.nim diff --git a/tests/exprs/tresultwarning.nim b/tests/exprs/tresultwarning.nim new file mode 100644 index 0000000000..985ca2efa7 --- /dev/null +++ b/tests/exprs/tresultwarning.nim @@ -0,0 +1,7 @@ +discard """ + msg: "Special variable 'result' is shadowed. [ResultShadowed]" + line: 7 +""" + +proc test(): string = + var result = "foo" From 1e1d58c3bc8d5c9172c6b1276a398bf165667090 Mon Sep 17 00:00:00 2001 From: Simon Hafner Date: Thu, 5 Mar 2015 14:53:46 -0600 Subject: [PATCH 3/5] nimout instead of msg for warnings --- tests/exprs/tresultwarning.nim | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/exprs/tresultwarning.nim b/tests/exprs/tresultwarning.nim index 985ca2efa7..32934408ea 100644 --- a/tests/exprs/tresultwarning.nim +++ b/tests/exprs/tresultwarning.nim @@ -1,6 +1,5 @@ discard """ - msg: "Special variable 'result' is shadowed. [ResultShadowed]" - line: 7 + nimout: "Special variable 'result' is shadowed. [ResultShadowed]" """ proc test(): string = From 20283b81fa51bf748c7708cad19f8eff37542e7a Mon Sep 17 00:00:00 2001 From: Simon Hafner Date: Fri, 6 Mar 2015 10:46:33 -0600 Subject: [PATCH 4/5] update WarningsToStr --- compiler/msgs.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/msgs.nim b/compiler/msgs.nim index 088468dcc1..bc7a1965f1 100644 --- a/compiler/msgs.nim +++ b/compiler/msgs.nim @@ -423,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", From 4d8e0d54c351b9338e9ebfa7738064be97167322 Mon Sep 17 00:00:00 2001 From: Simon Hafner Date: Sat, 7 Mar 2015 16:06:46 -0600 Subject: [PATCH 5/5] fixed array size --- compiler/msgs.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/msgs.nim b/compiler/msgs.nim index bc7a1965f1..b8d49b65ab 100644 --- a/compiler/msgs.nim +++ b/compiler/msgs.nim @@ -413,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",