Skip to content

Commit

Permalink
fixes #23755; array static inference during overload resolution (#23760)
Browse files Browse the repository at this point in the history
---------

Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
(cherry picked from commit 27abcdd)
  • Loading branch information
Graveflo authored and narimiran committed Oct 5, 2024
1 parent 3c66401 commit 35b9d6a
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 11 deletions.
7 changes: 3 additions & 4 deletions compiler/sigmatch.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1283,13 +1283,14 @@ proc typeRel(c: var TCandidate, f, aOrig: PType,
subtypeCheck()
of tyArray:
a = reduceToBase(a)
case a.kind
of tyArray:
if a.kind == tyArray:
var fRange = f[0]
var aRange = a[0]
if fRange.kind in {tyGenericParam, tyAnything}:
var prev = PType(idTableGet(c.bindings, fRange))
if prev == nil:
if typeRel(c, fRange, aRange) == isNone:
return isNone
put(c, fRange, a[0])
fRange = a
else:
Expand All @@ -1302,7 +1303,6 @@ proc typeRel(c: var TCandidate, f, aOrig: PType,
result = isGeneric
else:
result = typeRel(c, ff, aa, flags)

if result < isGeneric:
if nimEnableCovariance and
trNoCovariance notin flags and
Expand All @@ -1321,7 +1321,6 @@ proc typeRel(c: var TCandidate, f, aOrig: PType,
else:
if lengthOrd(c.c.config, fRange) != lengthOrd(c.c.config, aRange):
result = isNone
else: discard
of tyUncheckedArray:
if a.kind == tyUncheckedArray:
result = typeRel(c, base(f), base(a), flags)
Expand Down
23 changes: 16 additions & 7 deletions compiler/types.nim
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ proc isPureObject*(typ: PType): bool =
proc isUnsigned*(t: PType): bool =
t.skipTypes(abstractInst).kind in {tyChar, tyUInt..tyUInt64}

proc getOrdValue*(n: PNode; onError = high(Int128)): Int128 =
proc getOrdValueAux*(n: PNode, err: var bool): Int128 =
var k = n.kind
if n.typ != nil and n.typ.skipTypes(abstractInst).kind in {tyChar, tyUInt..tyUInt64}:
k = nkUIntLit
Expand All @@ -133,13 +133,22 @@ proc getOrdValue*(n: PNode; onError = high(Int128)): Int128 =
toInt128(n.intVal)
of nkNilLit:
int128.Zero
of nkHiddenStdConv: getOrdValue(n[1], onError)
of nkHiddenStdConv:
getOrdValueAux(n[1], err)
else:
# XXX: The idea behind the introduction of int128 was to finally
# have all calculations numerically far away from any
# overflows. This command just introduces such overflows and
# should therefore really be revisited.
onError
err = true
int128.Zero

proc getOrdValue*(n: PNode): Int128 =
var err: bool = false
result = getOrdValueAux(n, err)
#assert err == false

proc getOrdValue*(n: PNode, onError: Int128): Int128 =
var err = false
result = getOrdValueAux(n, err)
if err:
result = onError

proc getFloatValue*(n: PNode): BiggestFloat =
case n.kind
Expand Down
52 changes: 52 additions & 0 deletions tests/overload/t23755.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
type
BigInt[bits: static int] = object
limbs: array[8, uint64]

block:
proc view[N](a: array[N, uint64]) =
discard

proc view[N](a: var array[N, uint64]) =
discard

var r: BigInt[64]
r.limbs.view()


type Limbs[N: static int] = array[N, uint64]

block:
proc view(a: Limbs) =
discard

proc view(a: var Limbs) =
discard

var r: BigInt[64]
r.limbs.view()


block:
type IntArray[N: static[int]] = array[N, int]

proc p[T](a: IntArray[T]): bool= true
proc p(a: IntArray[5]): bool= false

var s: IntArray[5]
doAssert s.p == false

block:
type IntArray[N: static[int]] = array[N, int]

proc `$`(a: IntArray): string =
return "test"

var s: IntArray[5] = [1,1,1,1,1]
doAssert `$`(s) == "test"

block:
proc p[n:static[int]](a: array[n, char]):bool=true
proc p[T, IDX](a: array[IDX, T]):bool=false

var g: array[32, char]
doAssert p(g)

0 comments on commit 35b9d6a

Please sign in to comment.