diff options
-rw-r--r-- | compiler/semstmts.nim | 2 | ||||
-rw-r--r-- | compiler/semtypes.nim | 7 | ||||
-rw-r--r-- | tests/casestmt/tincompletecaseobject2.nim | 12 |
3 files changed, 15 insertions, 6 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 0e87c205a..50543466a 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -953,7 +953,7 @@ proc semCase(c: PContext, n: PNode; flags: TExprFlags): PNode = if chckCovered: if covered == toCover(c, n[0].typ): 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" % formatMissingEnums(c, n)) else: diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index cb6cb04f7..f1acaf8ea 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -607,7 +607,7 @@ iterator processBranchVals(b: PNode): int = assert b.kind in {nkOfBranch, nkElifBranch, nkElse} if b.kind == nkOfBranch: for i in 0..<b.len-1: - if b[i].kind == nkIntLit: + if b[i].kind in {nkIntLit, nkCharLit}: yield b[i].intVal.int elif b[i].kind == nkRange: 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: if result.len > 1: result &= ", " - if t.kind in {tyEnum, tyBool}: + case t.kind: + of tyEnum, tyBool: while t.n[enumSymOffset].sym.position < val: inc(enumSymOffset) result &= t.n[enumSymOffset].sym.name.s + of tyChar: + result.addQuoted(char(val)) else: if i == 64: result &= "omitted $1 values..." % $(vals.len - i) diff --git a/tests/casestmt/tincompletecaseobject2.nim b/tests/casestmt/tincompletecaseobject2.nim index ccf6a3a6c..c080cfeb1 100644 --- a/tests/casestmt/tincompletecaseobject2.nim +++ b/tests/casestmt/tincompletecaseobject2.nim @@ -2,9 +2,10 @@ discard """ cmd: "nim check $file" errormsg: "not all cases are covered; missing: {A, B}" nimout: ''' -tincompletecaseobject2.nim(16, 1) Error: not all cases are covered; missing: {B, C, D} -tincompletecaseobject2.nim(19, 1) Error: not all cases are covered; missing: {A, C} -tincompletecaseobject2.nim(22, 1) Error: not all cases are covered; missing: {A, B} +tincompletecaseobject2.nim(18, 1) Error: not all cases are covered; missing: {' ', '!', '\"', '#', '$', '%', '&', '\'', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~'} +tincompletecaseobject2.nim(22, 1) Error: not all cases are covered; missing: {B, C, D} +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 @@ -12,6 +13,11 @@ type AliasABCD = ABCD RangeABC = range[A .. C] AliasRangeABC = RangeABC + PrintableChars = range[' ' .. '~'] + +case PrintableChars 'x': +of '0'..'9', 'A'..'Z', 'a'..'z': discard +of '(', ')': discard case AliasABCD A: of A: discard |