Merge pull request #2184 from oderwat/feat-caseofwhen
Allow empty sets in case/of branches.
This commit is contained in:
commit
819a2a03ac
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