@@ -59,31 +59,11 @@ proc newConstraint(c: PContext, k: TTypeKind): PType =
5959 result .flags.incl tfCheckedForDestructor
6060 result .addSonSkipIntLit (newTypeS (k, c), c.idgen)
6161
62- proc skipGenericPrev (prev: PType ): PType =
63- result = prev
64- if prev.kind == tyGenericBody and prev.last.kind != tyNone:
65- result = prev.last
66-
67- proc prevIsKind (prev: PType , kind: TTypeKind ): bool {.inline .} =
68- result = prev != nil and skipGenericPrev (prev).kind == kind
69-
7062proc semEnum (c: PContext , n: PNode , prev: PType ): PType =
7163 if n.len == 0 : return newConstraint (c, tyEnum)
7264 elif n.len == 1 :
7365 # don't create an empty tyEnum; fixes #3052
7466 return errorType (c)
75- if prevIsKind (prev, tyEnum):
76- # the symbol already has an enum type (likely resem), don't define a new enum
77- # but add the enum fields to scope from the original type
78- let isPure = sfPure in prev.sym.flags
79- for enumField in prev.n:
80- assert enumField.kind == nkSym
81- let e = enumField.sym
82- if not isPure:
83- addInterfaceOverloadableSymAt (c, c.currentScope, e)
84- else :
85- declarePureEnumField (c, e)
86- return prev
8767 var
8868 counter, x: BiggestInt = 0
8969 e: PSym = nil
@@ -217,7 +197,7 @@ proc semSet(c: PContext, n: PNode, prev: PType): PType =
217197 if base.kind in {tyGenericInst, tyAlias, tySink}: base = skipModifier (base)
218198 if base.kind notin {tyGenericParam, tyGenericInvocation}:
219199 if base.kind == tyForward:
220- c.forwardTypeUpdates .add (base, n[ 1 ])
200+ c.skipTypes .add n
221201 elif not isOrdinalType (base, allowEnumWithHoles = true ):
222202 localError (c.config, n.info, errOrdinalTypeExpected % typeToString (base, preferDesc))
223203 elif lengthOrd (c.config, base) > MaxSetElements :
@@ -327,9 +307,6 @@ proc addSonSkipIntLitChecked(c: PContext; father, son: PType; it: PNode, id: IdG
327307
328308proc semDistinct (c: PContext , n: PNode , prev: PType ): PType =
329309 if n.len == 0 : return newConstraint (c, tyDistinct)
330- if prevIsKind (prev, tyDistinct):
331- # the symbol already has a distinct type (likely resem), don't create a new type
332- return skipGenericPrev (prev)
333310 result = newOrPrevType (tyDistinct, prev, c)
334311 addSonSkipIntLitChecked (c, result , semTypeNode (c, n[0 ], nil ), n[0 ], c.idgen)
335312 if n.len > 1 : result .n = n[1 ]
@@ -1017,15 +994,11 @@ proc semObjectNode(c: PContext, n: PNode, prev: PType; flags: TTypeFlags): PType
1017994 result = nil
1018995 if n.len == 0 :
1019996 return newConstraint (c, tyObject)
1020- if prevIsKind (prev, tyObject) and sfForward notin prev.sym.flags:
1021- # the symbol already has an object type (likely resem), don't create a new type
1022- return skipGenericPrev (prev)
1023997 var check = initIntSet ()
1024998 var pos = 0
1025999 var base, realBase: PType = nil
10261000 # n[0] contains the pragmas (if any). We process these later...
10271001 checkSonsLen (n, 3 , c.config)
1028- var needsForwardUpdate = false
10291002 if n[1 ].kind != nkEmpty:
10301003 realBase = semTypeNode (c, n[1 ][0 ], nil )
10311004 base = skipTypesOrNil (realBase, skipPtrs)
@@ -1047,7 +1020,7 @@ proc semObjectNode(c: PContext, n: PNode, prev: PType; flags: TTypeFlags): PType
10471020 return newType (tyError, c.idgen, result .owner)
10481021
10491022 elif concreteBase.kind == tyForward:
1050- needsForwardUpdate = true
1023+ c.skipTypes. add n # we retry in the final pass
10511024 else :
10521025 if concreteBase.kind != tyError:
10531026 localError (c.config, n[1 ].info, " inheritance only works with non-final objects; " &
@@ -1057,10 +1030,6 @@ proc semObjectNode(c: PContext, n: PNode, prev: PType; flags: TTypeFlags): PType
10571030 realBase = nil
10581031 if n.kind != nkObjectTy: internalError (c.config, n.info, " semObjectNode" )
10591032 result = newOrPrevType (tyObject, prev, c)
1060- if needsForwardUpdate:
1061- # if the inherited object is a forward type,
1062- # the entire object needs to be checked again
1063- c.forwardTypeUpdates.add (result , n) # we retry in the final pass
10641033 rawAddSon (result , realBase)
10651034 if realBase == nil and tfInheritable in flags:
10661035 result .flags.incl tfInheritable
@@ -1087,9 +1056,6 @@ proc semAnyRef(c: PContext; n: PNode; kind: TTypeKind; prev: PType): PType =
10871056 if n.len < 1 :
10881057 result = newConstraint (c, kind)
10891058 else :
1090- if prevIsKind (prev, kind) and tfRefsAnonObj in prev.skipTypes ({tyGenericBody}).flags:
1091- # the symbol already has an object type (likely resem), don't create a new type
1092- return skipGenericPrev (prev)
10931059 let isCall = int ord (n.kind in nkCallKinds+ {nkBracketExpr})
10941060 let n = if n[0 ].kind == nkBracket: n[0 ] else : n
10951061 checkMinSonsLen (n, 1 , c.config)
@@ -1698,7 +1664,6 @@ proc semGeneric(c: PContext, n: PNode, s: PSym, prev: PType): PType =
16981664 for i in 1 ..< n.len:
16991665 var elem = semGenericParamInInvocation (c, n[i])
17001666 addToResult (elem, true )
1701- c.forwardTypeUpdates.add (result , n)
17021667 return
17031668 elif t.kind != tyGenericBody:
17041669 # we likely got code of the form TypeA[TypeB] where TypeA is
@@ -1747,7 +1712,7 @@ proc semGeneric(c: PContext, n: PNode, s: PSym, prev: PType): PType =
17471712 localError (c.config, n.info, errCannotInstantiateX % s.name.s)
17481713 result = newOrPrevType (tyError, prev, c)
17491714 elif containsGenericInvocationWithForward (n[0 ]):
1750- c.forwardTypeUpdates .add ( result , n) # fixes 1500
1715+ c.skipTypes .add n # fixes 1500
17511716 else :
17521717 result = instGenericContainer (c, n.info, result ,
17531718 allowMetaTypes = false )
0 commit comments