case coverage error message for char (#12948)

This commit is contained in:
Jasper Jenkins 2019-12-22 01:10:46 -08:00 • committed by Andreas Rumpf
commit 2e7c9eb6a8
3 changed files with 15 additions and 6 deletions

View file

@ -953,7 +953,7 @@ proc semCase(c: PContext, n: PNode; flags: TExprFlags): PNode =
if chckCovered: if chckCovered:
if covered == toCover(c, n[0].typ): if covered == toCover(c, n[0].typ):
hasElse = true hasElse = true
elif n[0].typ.skipTypes(abstractRange).kind == tyEnum: elif n[0].typ.skipTypes(abstractRange).kind in {tyEnum, tyChar}:
localError(c.config, n.info, "not all cases are covered; missing: $1" % localError(c.config, n.info, "not all cases are covered; missing: $1" %
formatMissingEnums(c, n)) formatMissingEnums(c, n))
else: else:

View file

@ -607,7 +607,7 @@ iterator processBranchVals(b: PNode): int =
assert b.kind in {nkOfBranch, nkElifBranch, nkElse} assert b.kind in {nkOfBranch, nkElifBranch, nkElse}
if b.kind == nkOfBranch: if b.kind == nkOfBranch:
for i in 0..<b.len-1: for i in 0..<b.len-1:
if b[i].kind == nkIntLit: if b[i].kind in {nkIntLit, nkCharLit}:
yield b[i].intVal.int yield b[i].intVal.int
elif b[i].kind == nkRange: elif b[i].kind == nkRange:
for i in b[i][0].intVal..b[i][1].intVal: for i in b[i][0].intVal..b[i][1].intVal:
@ -621,9 +621,12 @@ proc renderAsType(vals: IntSet, t: PType): string =
for val in vals: for val in vals:
if result.len > 1: if result.len > 1:
result &= ", " result &= ", "
if t.kind in {tyEnum, tyBool}: case t.kind:
of tyEnum, tyBool:
while t.n[enumSymOffset].sym.position < val: inc(enumSymOffset) while t.n[enumSymOffset].sym.position < val: inc(enumSymOffset)
result &= t.n[enumSymOffset].sym.name.s result &= t.n[enumSymOffset].sym.name.s
of tyChar:
result.addQuoted(char(val))
else: else:
if i == 64: if i == 64:
result &= "omitted $1 values..." % $(vals.len - i) result &= "omitted $1 values..." % $(vals.len - i)

View file

@ -2,9 +2,10 @@ discard """
cmd: "nim check $file" cmd: "nim check $file"
errormsg: "not all cases are covered; missing: {A, B}" errormsg: "not all cases are covered; missing: {A, B}"
nimout: ''' nimout: '''
tincompletecaseobject2.nim(16, 1) Error: not all cases are covered; missing: {B, C, D} tincompletecaseobject2.nim(18, 1) Error: not all cases are covered; missing: {' ', '!', '\"', '#', '$', '%', '&', '\'', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~'}
tincompletecaseobject2.nim(19, 1) Error: not all cases are covered; missing: {A, C} tincompletecaseobject2.nim(22, 1) Error: not all cases are covered; missing: {B, C, D}
tincompletecaseobject2.nim(22, 1) Error: not all cases are covered; missing: {A, B} tincompletecaseobject2.nim(25, 1) Error: not all cases are covered; missing: {A, C}
tincompletecaseobject2.nim(28, 1) Error: not all cases are covered; missing: {A, B}
''' '''
""" """
type type
@ -12,6 +13,11 @@ type
AliasABCD = ABCD AliasABCD = ABCD
RangeABC = range[A .. C] RangeABC = range[A .. C]
AliasRangeABC = RangeABC AliasRangeABC = RangeABC
PrintableChars = range[' ' .. '~']
case PrintableChars 'x':
of '0'..'9', 'A'..'Z', 'a'..'z': discard
of '(', ')': discard
case AliasABCD A: case AliasABCD A:
of A: discard of A: discard