* mitigates #12815

* Update doc/nimc.rst

Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com>

Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com>
This commit is contained in:
Andreas Rumpf 2021-07-22 11:59:21 +02:00 • committed by GitHub
commit 0c4582c665
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 5 deletions

View file

@ -72,6 +72,7 @@ type
warnFileChanged = "FileChanged", warnFileChanged = "FileChanged",
warnSuspiciousEnumConv = "EnumConv", warnSuspiciousEnumConv = "EnumConv",
warnAnyEnumConv = "AnyEnumConv", warnAnyEnumConv = "AnyEnumConv",
warnHoleEnumConv = "HoleEnumConv",
warnCstringConv = "CStringConv", warnCstringConv = "CStringConv",
warnUser = "User", warnUser = "User",
# hints # hints
@ -158,6 +159,7 @@ const
warnFileChanged: "file changed: $1", warnFileChanged: "file changed: $1",
warnSuspiciousEnumConv: "$1", warnSuspiciousEnumConv: "$1",
warnAnyEnumConv: "$1", warnAnyEnumConv: "$1",
warnHoleEnumConv: "$1",
warnCstringConv: "$1", warnCstringConv: "$1",
warnUser: "$1", warnUser: "$1",
hintSuccess: "operation successful: $#", hintSuccess: "operation successful: $#",

View file

@ -1173,8 +1173,12 @@ proc track(tracked: PEffects, n: PNode) =
"implicit conversion to 'cstring' from a non-const location: $1; this will become a compile time error in the future" % "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: let t = n.typ.skipTypes(abstractInst)
message(tracked.config, n.info, warnAnyEnumConv, "enum conversion: $1" % $n[1]) if t.kind == tyEnum:
if tfEnumHasHoles in t.flags:
message(tracked.config, n.info, warnHoleEnumConv, "conversion to enum with holes is unsafe: $1" % $n)
else:
message(tracked.config, n.info, warnAnyEnumConv, "enum conversion: $1" % $n)
if n.len == 2: if n.len == 2:
track(tracked, n[1]) track(tracked, n[1])

View file

@ -74,6 +74,8 @@ CStringConv Warn about dangerous implicit conversions
to `cstring`. to `cstring`.
EnumConv Warn about conversions from enum to enum. EnumConv Warn about conversions from enum to enum.
AnyEnumConv Warn about any conversions to an enum type. AnyEnumConv Warn about any conversions to an enum type.
HoleEnumConv Warn about conversion to an enum with
holes. These conversions are unsafe.
ResultUsed Warn about the usage of the ResultUsed Warn about the usage of the
built-in `result` variable. built-in `result` variable.
User Some user-defined warning. User Some user-defined warning.

View file

@ -95,13 +95,26 @@ reject:
{.push warning[AnyEnumConv]:on, warningAsError[AnyEnumConv]:on.} {.push warning[AnyEnumConv]:on, warningAsError[AnyEnumConv]:on.}
reject: reject:
# bug #12815
type type
Foo = enum Foo = enum
one = 1 one
three = 3 three
var va = 2 var va = 2
var vb = va.Foo var vb = va.Foo
{.pop.} {.pop.}
{.push warningAsError[HoleEnumConv]:on.}
reject:
# bug #12815
type
Hole = enum
one = 1
three = 3
var va = 2
var vb = va.Hole
{.pop.}