diff --git a/compiler/astalgo.nim b/compiler/astalgo.nim index 564f262d7f..364e164bbc 100644 --- a/compiler/astalgo.nim +++ b/compiler/astalgo.nim @@ -156,6 +156,10 @@ proc skipConv*(n: PNode): PNode = result = n.sons[1] else: result = n +proc skipConvTakeType*(n: PNode): PNode = + result = n.skipConv + result.typ = n.typ + proc SameValue*(a, b: PNode): bool = result = false case a.kind diff --git a/compiler/nimsets.nim b/compiler/nimsets.nim index 14e9ae7265..118046283c 100644 --- a/compiler/nimsets.nim +++ b/compiler/nimsets.nim @@ -44,9 +44,9 @@ proc inSet(s: PNode, elem: PNode): bool = return true result = false -proc overlap(a, b: PNode): bool = - if a.kind == nkRange: - if b.kind == nkRange: +proc overlap(a, b: PNode): bool = + if a.kind == nkRange: + if b.kind == nkRange: # X..Y and C..D overlap iff (X <= D and C <= Y) result = leValue(a.sons[0], b.sons[1]) and leValue(b.sons[0], a.sons[1]) diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index dbb05dc5f2..799be1a911 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -323,8 +323,8 @@ proc semBranchRange(c: PContext, t, a, b: PNode, covered: var biggestInt): PNode checkMinSonsLen(t, 1) let ac = semConstExpr(c, a) let bc = semConstExpr(c, b) - let at = fitNode(c, t.sons[0].typ, ac) - let bt = fitNode(c, t.sons[0].typ, bc) + let at = fitNode(c, t.sons[0].typ, ac).skipConvTakeType + let bt = fitNode(c, t.sons[0].typ, bc).skipConvTakeType result = newNodeI(nkRange, a.info) result.add(at) diff --git a/tests/reject/tcaseoverlaprange2.nim b/tests/reject/tcaseoverlaprange2.nim new file mode 100644 index 0000000000..d6e301508b --- /dev/null +++ b/tests/reject/tcaseoverlaprange2.nim @@ -0,0 +1,18 @@ +discard """ + line: 13 + errormsg: "duplicate case label" +""" + + + + +proc checkDuplicates(myval: int32): bool = + case myval + of 0x7B: + echo "this should not compile" + of 0x78 .. 0x7D: + result = true + else: + nil + +echo checkDuplicates(0x7B) diff --git a/todo.txt b/todo.txt index 346a8b86d0..d159728e34 100644 --- a/todo.txt +++ b/todo.txt @@ -31,7 +31,6 @@ Bugs - osproc execProcesses can deadlock if all processes fail (as experienced in c++ mode) - bootstrapping does not work in C++ mode -- case statement exhaustiveness checking is still wrong - the new m&s GC is still buggy