This commit is contained in:
Andreas Rumpf
2020-03-27 12:14:57 +01:00
committed by GitHub
parent 0eaacbc2c4
commit 0a49fe5fad
2 changed files with 10 additions and 1 deletions

View File

@@ -1329,8 +1329,10 @@ proc typeSectionFinalPass(c: PContext, n: PNode) =
else:
while x.kind in {nkStmtList, nkStmtListExpr} and x.len > 0:
x = x.lastSon
# we need the 'safeSkipTypes' here because illegally recursive types
# can enter at this point, see bug #13763
if x.kind notin {nkObjectTy, nkDistinctTy, nkEnumTy, nkEmpty} and
s.typ.skipTypes(abstractPtrs-{tyAlias}).kind notin {tyObject, tyEnum}:
s.typ.safeSkipTypes(abstractPtrs).kind notin {tyObject, tyEnum}:
# type aliases are hard:
var t = semTypeNode(c, x, nil)
assert t != nil

View File

@@ -1503,6 +1503,13 @@ proc containsCompileTimeOnly*(t: PType): bool =
return true
return false
proc safeSkipTypes*(t: PType, kinds: TTypeKinds): PType =
## same as 'skipTypes' but with a simple cycle detector.
result = t
var seen = initIntSet()
while result.kind in kinds and not containsOrIncl(seen, result.id):
result = lastSon(result)
type
OrdinalType* = enum
NoneLike, IntLike, FloatLike