This commit is contained in:
Andreas Rumpf
2021-07-22 09:37:41 +02:00
committed by GitHub
parent d5b5827bc2
commit 58e27ebd4a
6 changed files with 30 additions and 3 deletions

View File

@@ -36,6 +36,9 @@
This warning will become an error in future versions! Use an explicit conversion
like `cstring(x)` in order to silence the warning.
- There is a new warning for *any* type conversion to enum that can be enabled via
`.warning[AnyEnumConv]:on` or `--warning:AnyEnumConv:on`.
- Type mismatch errors now show more context, use `-d:nimLegacyTypeMismatch` for previous
behavior.

View File

@@ -1064,7 +1064,7 @@ proc getPIdent*(a: PNode): PIdent {.inline.} =
# which may simplify code.
case a.kind
of nkSym: a.sym.name
of nkIdent: a.ident
of nkIdent: a.ident
else: nil
proc getnimblePkg*(a: PSym): PSym =

View File

@@ -71,6 +71,7 @@ type
warnCannotOpen = "CannotOpen",
warnFileChanged = "FileChanged",
warnSuspiciousEnumConv = "EnumConv",
warnAnyEnumConv = "AnyEnumConv",
warnCstringConv = "CStringConv",
warnUser = "User",
# hints
@@ -156,6 +157,7 @@ const
warnCannotOpen: "cannot open: $1",
warnFileChanged: "file changed: $1",
warnSuspiciousEnumConv: "$1",
warnAnyEnumConv: "$1",
warnCstringConv: "$1",
warnUser: "$1",
hintSuccess: "operation successful: $#",
@@ -211,7 +213,7 @@ type
TNoteKinds* = set[TNoteKind]
proc computeNotesVerbosity(): array[0..3, TNoteKinds] =
result[3] = {low(TNoteKind)..high(TNoteKind)} - {warnObservableStores, warnResultUsed}
result[3] = {low(TNoteKind)..high(TNoteKind)} - {warnObservableStores, warnResultUsed, warnAnyEnumConv}
result[2] = result[3] - {hintStackTrace, warnUninit, hintExtendedContext, hintDeclaredLoc, hintProcessingStmt}
result[1] = result[2] - {warnProveField, warnProveIndex,
warnGcUnsafe, hintPath, hintDependency, hintCodeBegin, hintCodeEnd,

View File

@@ -1171,7 +1171,10 @@ proc track(tracked: PEffects, n: PNode) =
not allowCStringConv(n[1]):
message(tracked.config, n.info, warnCstringConv,
"implicit conversion to 'cstring' from a non-const location: $1; this will become a compile time error in the future" %
[$n[1]])
$n[1])
if n.typ.skipTypes(abstractInst).kind == tyEnum:
message(tracked.config, n.info, warnAnyEnumConv, "enum conversion: $1" % $n[1])
if n.len == 2:
track(tracked, n[1])

View File

@@ -70,6 +70,12 @@ SmallLshouldNotBeUsed The letter 'l' should not be used as an
identifier.
EachIdentIsTuple The code contains a confusing `var`
declaration.
CStringConv Warn about dangerous implicit conversions
to `cstring`.
EnumConv Warn about conversions from enum to enum.
AnyEnumConv Warn about any conversions to an enum type.
ResultUsed Warn about the usage of the
built-in `result` variable.
User Some user-defined warning.
========================== ============================================

View File

@@ -92,3 +92,16 @@ reject:
x[0] = c
x
{.push warning[AnyEnumConv]:on, warningAsError[AnyEnumConv]:on.}
reject:
# bug #12815
type
Foo = enum
one = 1
three = 3
var va = 2
var vb = va.Foo
{.pop.}