Skip to content

Commit 6d21637

Browse files
authored
fix scoping regression with calls in generic bodies (#22115)
refs #22029, refs https://github.com/status-im/nim-libp2p/actions/runs/5263850340/jobs/9514434659
1 parent 647d961 commit 6d21637

File tree

4 files changed

+37
-3
lines changed

4 files changed

+37
-3
lines changed

compiler/sem.nim

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,8 @@ proc semExprFlagDispatched(c: PContext, n: PNode, flags: TExprFlags; expectedTyp
405405
evaluated = evalAtCompileTime(c, result)
406406
if evaluated != nil: return evaluated
407407

408+
proc semGenericStmt(c: PContext, n: PNode): PNode
409+
408410
include hlo, seminst, semcall
409411

410412
proc resetSemFlag(n: PNode) =
@@ -513,8 +515,6 @@ proc semConstBoolExpr(c: PContext, n: PNode): PNode =
513515
result = forceBool(c, semConstExpr(c, n, getSysType(c.graph, n.info, tyBool)))
514516
if result.kind != nkIntLit:
515517
localError(c.config, n.info, errConstExprExpected)
516-
517-
proc semGenericStmt(c: PContext, n: PNode): PNode
518518
proc semConceptBody(c: PContext, n: PNode): PNode
519519

520520
include semtypes

compiler/semcall.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,7 @@ proc semOverloadedCall(c: PContext, n, nOrig: PNode,
628628
result = semResolvedCall(c, r, n, flags)
629629
else:
630630
if efDetermineType in flags and c.inGenericContext > 0 and c.matchedConcept == nil:
631-
result = n
631+
result = semGenericStmt(c, n)
632632
result.typ = makeTypeFromExpr(c, result.copyTree)
633633
elif efExplain notin flags:
634634
# repeat the overload resolution,
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import std/bitops
2+
3+
const
4+
lengths = block:
5+
var v: array[64, int8]
6+
for i in 0..<64:
7+
v[i] = int8((i + 7) div 7)
8+
v
9+
10+
type
11+
Leb128* = object
12+
13+
{.push checks: off.}
14+
func len(T: type Leb128, x: SomeUnsignedInt): int8 =
15+
if x == 0: 1
16+
else: lengths[fastLog2(x)]
17+
{.pop.}
18+
19+
# note private to test scoping issue:
20+
func maxLen(T: type Leb128, I: type): int8 =
21+
Leb128.len(I.high)
22+
23+
type
24+
Leb128Buf*[T: SomeUnsignedInt] = object
25+
data*: array[maxLen(Leb128, T), byte]
26+
len*: int8

tests/generics/tuninstantiatedgenericcalls.nim

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,11 @@ block thardcases:
7070
doAssert high(f2.data3) == 4 # length of int8
7171

7272
doAssert f2.data3[0] is float
73+
74+
import muninstantiatedgenericcalls
75+
76+
block:
77+
var x: Leb128Buf[uint32]
78+
doAssert x.data.len == 5
79+
var y: Leb128Buf[uint16]
80+
doAssert y.data.len == 3

0 commit comments

Comments
 (0)