parent
0eaacbc2c4
commit
0a49fe5fad
2 changed files with 10 additions and 1 deletions
|
|
@ -1329,8 +1329,10 @@ proc typeSectionFinalPass(c: PContext, n: PNode) =
|
||||||
else:
|
else:
|
||||||
while x.kind in {nkStmtList, nkStmtListExpr} and x.len > 0:
|
while x.kind in {nkStmtList, nkStmtListExpr} and x.len > 0:
|
||||||
x = x.lastSon
|
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
|
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:
|
# type aliases are hard:
|
||||||
var t = semTypeNode(c, x, nil)
|
var t = semTypeNode(c, x, nil)
|
||||||
assert t != nil
|
assert t != nil
|
||||||
|
|
|
||||||
|
|
@ -1503,6 +1503,13 @@ proc containsCompileTimeOnly*(t: PType): bool =
|
||||||
return true
|
return true
|
||||||
return false
|
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
|
type
|
||||||
OrdinalType* = enum
|
OrdinalType* = enum
|
||||||
NoneLike, IntLike, FloatLike
|
NoneLike, IntLike, FloatLike
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue