Make unreachable else in case statements a warning instead of an error (#14190)

* Fix #14019 by making trailing else a warning

* Rename to UnreachableElse
This commit is contained in:
Clyybber
2020-05-02 16:09:02 +02:00
committed by GitHub
parent 1f1e4de3bc
commit 83547ec769
3 changed files with 5 additions and 4 deletions

View File

@@ -39,7 +39,7 @@ type
warnEachIdentIsTuple,
warnUnsafeSetLen,
warnUnsafeDefault,
warnProveInit, warnProveField, warnProveIndex,
warnProveInit, warnProveField, warnProveIndex, warnUnreachableElse,
warnStaticIndexCheck, warnGcUnsafe, warnGcUnsafe2,
warnUninit, warnGcMem, warnDestructor, warnLockLevel, warnResultShadowed,
warnInconsistentSpacing, warnCaseTransition, warnCycleCreated, warnUser,
@@ -96,6 +96,7 @@ const
warnProveInit: "Cannot prove that '$1' is initialized. This will become a compile time error in the future.",
warnProveField: "cannot prove that field '$1' is accessible",
warnProveIndex: "cannot prove index '$1' is valid",
warnUnreachableElse: "unreachable else, all cases are already covered",
warnStaticIndexCheck: "$1",
warnGcUnsafe: "not GC-safe: '$1'",
warnGcUnsafe2: "$1",
@@ -153,7 +154,7 @@ const
"UnsafeCode", "UnusedImport", "InheritFromException",
"EachIdentIsTuple",
"UnsafeSetLen", "UnsafeDefault",
"ProveInit", "ProveField", "ProveIndex",
"ProveInit", "ProveField", "ProveIndex", "UnreachableElse",
"IndexCheck", "GcUnsafe", "GcUnsafe2", "Uninit",
"GcMem", "Destructor", "LockLevel", "ResultShadowed",
"Spacing", "CaseTransition", "CycleCreated", "User"]

View File

@@ -998,7 +998,7 @@ proc semCase(c: PContext, n: PNode; flags: TExprFlags): PNode =
x[0] = semExprBranchScope(c, x[0])
typ = commonType(typ, x[0])
if (chckCovered and covered == toCover(c, n[0].typ)) or hasElse:
localError(c.config, x.info, "invalid else, all cases are already covered")
message(c.config, x.info, warnUnreachableElse)
hasElse = true
chckCovered = false
else:

View File

@@ -695,7 +695,7 @@ proc semRecordCase(c: PContext, n: PNode, check: var IntSet, pos: var int,
of nkElse:
checkSonsLen(b, 1, c.config)
if chckCovered and covered == toCover(c, a[0].typ):
localError(c.config, b.info, "invalid else, all cases are already covered")
message(c.config, b.info, warnUnreachableElse)
chckCovered = false
else: illFormedAst(n, c.config)
delSon(b, b.len - 1)