mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-18 21:40:32 +00:00
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:
@@ -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