fix #20997 calling system.card[T](x: set[T]) with T of int8 or uint8 … (#21010)

* fix #20997 calling system.card[T](x: set[T]) with T of int8 or uint8 uses mismatched C array sizes
* fullfil set variant
This commit is contained in:
Bung
2022-12-23 19:20:25 +08:00
committed by GitHub
parent ca9c74391a
commit 0b319fee3d
3 changed files with 24 additions and 4 deletions

View File

@@ -2126,7 +2126,7 @@ proc genSetOp(p: BProc, e: PNode, d: var TLoc, op: TMagic) =
of mCard:
var a: TLoc
initLocExpr(p, e[1], a)
putIntoDest(p, d, e, ropecg(p.module, "#cardSet($1, $2)", [rdCharLoc(a), size]))
putIntoDest(p, d, e, ropecg(p.module, "#cardSet($1, $2)", [addrLoc(p.config, a), size]))
of mLtSet, mLeSet:
getTemp(p, getSysType(p.module.g.graph, unknownLineInfo, tyInt), i) # our counter
initLocExpr(p, e[1], a)

View File

@@ -10,10 +10,9 @@
# set handling
type
NimSet = array[0..4*2048-1, uint8]
NimSet = array[0..8192-1, uint8]
proc cardSet(s: NimSet, len: int): int {.compilerproc, inline.} =
proc cardSetImpl(s: openArray[uint8], len: int): int {.inline.} =
var i = 0
result = 0
when defined(x86) or defined(amd64):
@@ -24,3 +23,6 @@ proc cardSet(s: NimSet, len: int): int {.compilerproc, inline.} =
while i < len:
inc(result, countBits32(uint32(s[i])))
inc(i, 1)
proc cardSet(s: NimSet, len: int): int {.compilerproc, inline.} =
result = cardSetImpl(s, len)

18
tests/sets/t20997.nim Normal file
View File

@@ -0,0 +1,18 @@
discard """
joinable: false
"""
{.passC: "-flto".}
{.passL: "-flto".}
template f(n: int) = discard card(default(set[range[0 .. (1 shl n) - 1]]))
f( 7)
f( 8)
f( 9)
f(10)
f(11)
f(12)
f(13)
f(14)
f(15)
f(16)