Allow empty sets in case/of branches.

Added support for conditional compilation using 'when' with empty sets and arrays in
'case of' branches.

 Please enter the commit message for your changes. Lines starting
This commit is contained in:
Hans Raaf 2015-02-20 23:07:05 +01:00
commit 79384ea729
2 changed files with 30 additions and 2 deletions

View file

@ -452,6 +452,7 @@ proc semCaseBranchSetElem(c: PContext, t, b: PNode,
proc semCaseBranch(c: PContext, t, branch: PNode, branchIndex: int, proc semCaseBranch(c: PContext, t, branch: PNode, branchIndex: int,
covered: var BiggestInt) = covered: var BiggestInt) =
for i in countup(0, sonsLen(branch) - 2): for i in countup(0, sonsLen(branch) - 2):
var b = branch.sons[i] var b = branch.sons[i]
if b.kind == nkRange: if b.kind == nkRange:
@ -461,8 +462,11 @@ proc semCaseBranch(c: PContext, t, branch: PNode, branchIndex: int,
else: else:
# constant sets and arrays are allowed: # constant sets and arrays are allowed:
var r = semConstExpr(c, b) var r = semConstExpr(c, b)
# for ``{}`` we want to trigger the type mismatch in ``fitNode``: if r.kind in {nkCurly, nkBracket} and len(r) == 0 and sonsLen(branch)==2:
if r.kind notin {nkCurly, nkBracket} or len(r) == 0: # discarding ``{}`` and ``[]`` branches silently
delSon(branch, 0)
return
elif r.kind notin {nkCurly, nkBracket} or len(r) == 0:
checkMinSonsLen(t, 1) checkMinSonsLen(t, 1)
branch.sons[i] = skipConv(fitNode(c, t.sons[0].typ, r)) branch.sons[i] = skipConv(fitNode(c, t.sons[0].typ, r))
inc(covered) inc(covered)

View file

@ -0,0 +1,24 @@
discard """
file: "tcaseofwhen.nim"
outputsub: "compiles for 1\ni am always two\ndefault for 3\nset is 4 not 5\narray is 6 not 7\ndefault for 8"
exitcode: "0"
"""
proc whenCase(a: int) =
case a
of (when compiles(whenCase(1)): 1 else: {}): echo "compiles for 1"
of {}: echo "me not fail"
of 2: echo "i am always two"
of []: echo "me neither"
of {4,5}: echo "set is 4 not 5"
of [6,7]: echo "array is 6 not 7"
of (when compiles(neverCompilesIBet()): 3 else: {}): echo "compiles for 3"
#of {},[]: echo "me neither"
else: echo "default for ", a
whenCase(1)
whenCase(2)
whenCase(3)
whenCase(4)
whenCase(6)
whenCase(8)