Skip to content

Commit

Permalink
Fix #20416. Enable the recursion limit for ref/ptr types. (#21092)
Browse files Browse the repository at this point in the history
  • Loading branch information
deech authored Dec 13, 2022
1 parent e4aadcf commit 2564b5c
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 4 deletions.
18 changes: 14 additions & 4 deletions compiler/semtypinst.nim
Original file line number Diff line number Diff line change
Expand Up @@ -499,10 +499,20 @@ proc propagateFieldFlags(t: PType, n: PNode) =

proc replaceTypeVarsTAux(cl: var TReplTypeVars, t: PType): PType =
template bailout =
if t.sym != nil and sfGeneratedType in t.sym.flags:
# Only consider the recursion limit if the symbol is a type with generic
# parameters that have not been explicitly supplied, typechecking should
# terminate when generic parameters are explicitly supplied.
if (t.sym == nil) or (t.sym != nil and sfGeneratedType in t.sym.flags):
# In the first case 't.sym' can be 'nil' if the type is a ref/ptr, see
# issue https://github.com/nim-lang/Nim/issues/20416 for more details.
# Fortunately for us this works for now because partial ref/ptr types are
# not allowed in object construction, eg.
# type
# Container[T] = ...
# O = object
# val: ref Container
#
# In the second case only consider the recursion limit if the symbol is a
# type with generic parameters that have not been explicitly supplied,
# typechecking should terminate when generic parameters are explicitly
# supplied.
if cl.recursionLimit > 100:
# bail out, see bug #2509. But note this caching is in general wrong,
# look at this example where TwoVectors should not share the generic
Expand Down
20 changes: 20 additions & 0 deletions tests/generics/tgenerics_issues.nim
Original file line number Diff line number Diff line change
Expand Up @@ -872,3 +872,23 @@ block: # Ensure no segfault from constraint
a = Regex[int]()
b = Regex[bool]()
c = MyOtherType[seq[int]]()

block: # https://github.com/nim-lang/Nim/issues/20416
type
Item[T] = object
link:ptr Item[T]
data:T

KVSeq[A,B] = seq[(A,B)]

MyTable[A,B] = object
data: KVSeq[A,B]

Container[T] = object
a: MyTable[int,ref Item[T]]

proc p1(sg:Container) = discard # Make sure that a non parameterized 'Container' argument still compiles

proc p2[T](sg:Container[T]) = discard
var v : Container[int]
p2(v)

0 comments on commit 2564b5c

Please sign in to comment.