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:
parent
7324ed7f1f
commit
79384ea729
2 changed files with 30 additions and 2 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
24
tests/casestmt/tcase_emptyset_when.nim
Normal file
24
tests/casestmt/tcase_emptyset_when.nim
Normal 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)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue