diff options
author | metagn <metagngn@gmail.com> | 2022-09-03 10:52:13 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-03 09:52:13 +0200 |
commit | 86f7f4ffa5b8d84cbff12afbcd9b88d3ceb429c8 (patch) | |
tree | a33f6930efe6342f9e4a9bb4b72c12f68213005e /compiler/semstmts.nim | |
parent | f540fd5cde268d2ecd1e22a20cac0879bf405f85 (diff) | |
download | Nim-86f7f4ffa5b8d84cbff12afbcd9b88d3ceb429c8.tar.gz |
remove deprecated type pragma syntax, fix bugs that required it (#20199)
* remove deprecated pragma syntax from 0.20.0 closes #4651, closes #16653 with a cheap fix for now due to how early `tfFinal` is set * remove type pragma between name and generics * undo removal, try removing bind expression (0.8.14) * fix test, unremove bind expr * remove again * Update changelog.md Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com> * dependencies @ HEAD & weave test dependencies * try fix package ci Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com>
Diffstat (limited to 'compiler/semstmts.nim')
-rw-r--r-- | compiler/semstmts.nim | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 6ced487ce..64d56f812 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -1327,6 +1327,7 @@ proc typeSectionRightSidePass(c: PContext, n: PNode) = if s.magic == mNone and a[2].kind == nkEmpty: localError(c.config, a.info, errImplOfXexpected % s.name.s) if s.magic != mNone: processMagicType(c, s) + let oldFlags = s.typ.flags if a[1].kind != nkEmpty: # We have a generic type declaration here. In generic types, # symbol lookup needs to be done here. @@ -1354,6 +1355,13 @@ proc typeSectionRightSidePass(c: PContext, n: PNode) = if body != nil: body.sym = s body.size = -1 # could not be computed properly + if body.kind == tyObject: + # add flags applied to generic type to object (nominal) type + incl(body.flags, oldFlags) + # {.inheritable, final.} is already disallowed, but + # object might have been assumed to be final + if tfInheritable in oldFlags and tfFinal in body.flags: + excl(body.flags, tfFinal) s.typ[^1] = body if tfCovariant in s.typ.flags: checkCovariantParamsUsages(c, s.typ) @@ -1405,6 +1413,13 @@ proc typeSectionRightSidePass(c: PContext, n: PNode) = internalAssert c.config, st.kind in {tyPtr, tyRef} internalAssert c.config, st.lastSon.sym == nil incl st.flags, tfRefsAnonObj + let objTy = st.lastSon + # add flags for `ref object` etc to underlying `object` + incl(objTy.flags, oldFlags) + # {.inheritable, final.} is already disallowed, but + # object might have been assumed to be final + if tfInheritable in oldFlags and tfFinal in objTy.flags: + excl(objTy.flags, tfFinal) let obj = newSym(skType, getIdent(c.cache, s.name.s & ":ObjectType"), nextSymId c.idgen, getCurrOwner(c), s.info) let symNode = newSymNode(obj) @@ -1420,8 +1435,8 @@ proc typeSectionRightSidePass(c: PContext, n: PNode) = obj.ast[2] = a[2][0] if sfPure in s.flags: obj.flags.incl sfPure - obj.typ = st.lastSon - st.lastSon.sym = obj + obj.typ = objTy + objTy.sym = obj proc checkForMetaFields(c: PContext; n: PNode) = proc checkMeta(c: PContext; n: PNode; t: PType) = |