mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-18 21:40:32 +00:00
Merge pull request #2184 from oderwat/feat-caseofwhen
Allow empty sets in case/of branches.
This commit is contained in:
@@ -452,6 +452,7 @@ proc semCaseBranchSetElem(c: PContext, t, b: PNode,
|
||||
|
||||
proc semCaseBranch(c: PContext, t, branch: PNode, branchIndex: int,
|
||||
covered: var BiggestInt) =
|
||||
|
||||
for i in countup(0, sonsLen(branch) - 2):
|
||||
var b = branch.sons[i]
|
||||
if b.kind == nkRange:
|
||||
@@ -461,8 +462,11 @@ proc semCaseBranch(c: PContext, t, branch: PNode, branchIndex: int,
|
||||
else:
|
||||
# constant sets and arrays are allowed:
|
||||
var r = semConstExpr(c, b)
|
||||
# for ``{}`` we want to trigger the type mismatch in ``fitNode``:
|
||||
if r.kind notin {nkCurly, nkBracket} or len(r) == 0:
|
||||
if r.kind in {nkCurly, nkBracket} and len(r) == 0 and sonsLen(branch)==2:
|
||||
# discarding ``{}`` and ``[]`` branches silently
|
||||
delSon(branch, 0)
|
||||
return
|
||||
elif r.kind notin {nkCurly, nkBracket} or len(r) == 0:
|
||||
checkMinSonsLen(t, 1)
|
||||
branch.sons[i] = skipConv(fitNode(c, t.sons[0].typ, r))
|
||||
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)
|
||||
Reference in New Issue
Block a user