summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xrod/semstmts.nim9
-rwxr-xr-xrod/semtypes.nim3
-rwxr-xr-xtests/accept/compile/tenum2.nim16
3 files changed, 25 insertions, 3 deletions
diff --git a/rod/semstmts.nim b/rod/semstmts.nim
index f792dc691..b07e724bc 100755
--- a/rod/semstmts.nim
+++ b/rod/semstmts.nim
@@ -136,6 +136,13 @@ proc semWhile(c: PContext, n: PNode): PNode =
   dec(c.p.nestedLoopCounter)
   closeScope(c.tab)
 
+proc toCover(t: PType): biggestInt = 
+  var t2 = skipTypes(t, abstractVarRange)
+  if t2.kind == tyEnum and enumHasWholes(t2): 
+    result = sonsLen(t2.n)
+  else:
+    result = lengthOrd(skipTypes(t, abstractVar))
+
 proc semCase(c: PContext, n: PNode): PNode = 
   # check selector:
   result = n
@@ -169,7 +176,7 @@ proc semCase(c: PContext, n: PNode): PNode =
       checkSonsLen(x, 1)
       x.sons[0] = semStmtScope(c, x.sons[0])
     else: illFormedAst(x)
-  if chckCovered and (covered != lengthOrd(n.sons[0].typ)): 
+  if chckCovered and (covered != toCover(n.sons[0].typ)): 
     liMessage(n.info, errNotAllCasesCovered)
   closeScope(c.tab)
 
diff --git a/rod/semtypes.nim b/rod/semtypes.nim
index c4fadac8a..f4b17f071 100755
--- a/rod/semtypes.nim
+++ b/rod/semtypes.nim
@@ -275,9 +275,8 @@ proc semBranchExpr(c: PContext, t: PNode, ex: var PNode) =
 
 proc SemCaseBranch(c: PContext, t, branch: PNode, branchIndex: int, 
                    covered: var biggestInt) = 
-  var b: PNode
   for i in countup(0, sonsLen(branch) - 2): 
-    b = branch.sons[i]
+    var b = branch.sons[i]
     if b.kind == nkRange: 
       checkSonsLen(b, 2)
       semBranchExpr(c, t, b.sons[0])
diff --git a/tests/accept/compile/tenum2.nim b/tests/accept/compile/tenum2.nim
new file mode 100755
index 000000000..feba36dd6
--- /dev/null
+++ b/tests/accept/compile/tenum2.nim
@@ -0,0 +1,16 @@
+# Test that enum with holes is handled correctly by case statement
+
+type
+  TEnumHole = enum 
+    eA = 0,
+    eB = 4,
+    eC = 5
+    
+var
+  e: TEnumHole = eB
+  
+case e
+of eA: echo "A"
+of eB: echo "B"
+of eC: echo "C"
+