From f6eb1d4d7d09eee1c366eff44437034e12bbb099 Mon Sep 17 00:00:00 2001 From: metagn Date: Tue, 23 Aug 2022 20:44:37 +0300 Subject: [PATCH] remove {.this.} pragma, deprecated since 0.19 (#20201) Co-authored-by: Andreas Rumpf --- changelog.md | 1 + compiler/ast.nim | 1 - compiler/pragmas.nim | 9 ----- compiler/semcall.nim | 16 --------- compiler/semdata.nim | 2 -- compiler/semexprs.nim | 27 -------------- compiler/seminst.nim | 24 ++----------- tests/destructor/tcustomstrings.nim | 20 +++++------ .../tcsharpusingstatement.nim} | 0 tests/misc/tupcomingfeatures.nim | 35 ------------------- tests/overload/tselfderef.nim | 20 ----------- tests/usingstmt/tthis.nim | 15 -------- tests/usingstmt/tusingstmt.nim | 16 +++++++++ 13 files changed, 28 insertions(+), 158 deletions(-) rename tests/{usingstmt/tusingstatement.nim => misc/tcsharpusingstatement.nim} (100%) delete mode 100644 tests/misc/tupcomingfeatures.nim delete mode 100644 tests/overload/tselfderef.nim delete mode 100644 tests/usingstmt/tthis.nim create mode 100644 tests/usingstmt/tusingstmt.nim diff --git a/changelog.md b/changelog.md index 5049fe2049..4cdc53d3ec 100644 --- a/changelog.md +++ b/changelog.md @@ -29,6 +29,7 @@ - `nimPreviewDotLikeOps` is going to be removed or deprecated. +- The `{.this.}` pragma, deprecated since 0.19, has been removed. - `nil` is no longer a valid value for distinct pointer types. ## Standard library additions and changes diff --git a/compiler/ast.nim b/compiler/ast.nim index 27e4fab633..910c954515 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -333,7 +333,6 @@ const sfWrittenTo* = sfBorrow # param is assigned to sfEscapes* = sfProcvar # param escapes sfBase* = sfDiscriminant - sfIsSelf* = sfOverriden # param is 'self' sfCustomPragma* = sfRegister # symbol is custom pragma template const diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index 8c7d75024e..2e86b6c44a 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -1216,15 +1216,6 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: var int, if not isTopLevel(c): localError(c.config, n.info, "'experimental' pragma only valid as toplevel statement or in a 'push' environment") processExperimental(c, it) - of wThis: - if it.kind in nkPragmaCallKinds and it.len == 2: - c.selfName = considerQuotedIdent(c, it[1]) - message(c.config, n.info, warnDeprecated, "'.this' pragma is deprecated") - elif it.kind == nkIdent or it.len == 1: - c.selfName = getIdent(c.cache, "self") - message(c.config, n.info, warnDeprecated, "'.this' pragma is deprecated") - else: - localError(c.config, it.info, "'this' pragma is allowed to have zero or one arguments") of wNoRewrite: noVal(c, it) of wBase: diff --git a/compiler/semcall.nim b/compiler/semcall.nim index 4f956785e0..21e519a590 100644 --- a/compiler/semcall.nim +++ b/compiler/semcall.nim @@ -374,22 +374,6 @@ proc resolveOverloads(c: PContext, n, orig: PNode, let overloadsState = result.state if overloadsState != csMatch: - if c.p != nil and c.p.selfSym != nil: - # we need to enforce semchecking of selfSym again because it - # might need auto-deref: - var hiddenArg = newSymNode(c.p.selfSym) - hiddenArg.typ = nil - n.sons.insert(hiddenArg, 1) - orig.sons.insert(hiddenArg, 1) - - pickBest(f) - - if result.state != csMatch: - n.sons.delete(1) - orig.sons.delete(1) - excl n.flags, nfExprCall - else: return - if nfDotField in n.flags: internalAssert c.config, f.kind == nkIdent and n.len >= 2 diff --git a/compiler/semdata.nim b/compiler/semdata.nim index d7a4d2c1ca..2b1f19f9e3 100644 --- a/compiler/semdata.nim +++ b/compiler/semdata.nim @@ -36,7 +36,6 @@ type # statements owner*: PSym # the symbol this context belongs to resultSym*: PSym # the result symbol (if we are in a proc) - selfSym*: PSym # the 'self' symbol (if available) nestedLoopCounter*: int # whether we are in a loop or not nestedBlockCounter*: int # whether we are in a block or not next*: PProcCon # used for stacking procedure contexts @@ -149,7 +148,6 @@ type inParallelStmt*: int instTypeBoundOp*: proc (c: PContext; dc: PSym; t: PType; info: TLineInfo; op: TTypeAttachedOp; col: int): PSym {.nimcall.} - selfName*: PIdent cache*: IdentCache graph*: ModuleGraph signatures*: TStrTable diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index d3c62629d3..119daa8b3f 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1283,33 +1283,6 @@ proc semSym(c: PContext, n: PNode, sym: PSym, flags: TExprFlags): PNode = result = newSymNode(s, n.info) result.typ = makeTypeDesc(c, s.typ) of skField: - var p = c.p - while p != nil and p.selfSym == nil: - p = p.next - if p != nil and p.selfSym != nil: - var ty = skipTypes(p.selfSym.typ, {tyGenericInst, tyVar, tyLent, tyPtr, tyRef, - tyAlias, tySink, tyOwned}) - while tfBorrowDot in ty.flags: ty = ty.skipTypes({tyDistinct, tyGenericInst, tyAlias}) - var check: PNode = nil - if ty.kind == tyObject: - while true: - check = nil - let f = lookupInRecordAndBuildCheck(c, n, ty.n, s.name, check) - if f != nil and fieldVisible(c, f): - # is the access to a public field or in the same module or in a friend? - doAssert f == s - markUsed(c, n.info, f) - onUse(n.info, f) - result = newNodeIT(nkDotExpr, n.info, f.typ) - result.add makeDeref(newSymNode(p.selfSym)) - result.add newSymNode(f) # we now have the correct field - if check != nil: - check[0] = result - check.typ = result.typ - result = check - return result - if ty[0] == nil: break - ty = skipTypes(ty[0], skipPtrs) # old code, not sure if it's live code: markUsed(c, n.info, s) onUse(n.info, s) diff --git a/compiler/seminst.nim b/compiler/seminst.nim index 6fae0583d0..f5810c8143 100644 --- a/compiler/seminst.nim +++ b/compiler/seminst.nim @@ -28,32 +28,13 @@ proc addObjFieldsToLocalScope(c: PContext; n: PNode) = # it is not an error to shadow fields via parameters else: discard -proc rawPushProcCon(c: PContext, owner: PSym) = +proc pushProcCon*(c: PContext; owner: PSym) = var x: PProcCon new(x) x.owner = owner x.next = c.p c.p = x -proc rawHandleSelf(c: PContext; owner: PSym) = - const callableSymbols = {skProc, skFunc, skMethod, skConverter, skIterator, skMacro} - if c.selfName != nil and owner.kind in callableSymbols and owner.typ != nil: - let params = owner.typ.n - if params.len > 1: - let arg = params[1].sym - if arg.name.id == c.selfName.id: - c.p.selfSym = arg - arg.flags.incl sfIsSelf - var t = c.p.selfSym.typ.skipTypes(abstractPtrs) - while t.kind == tyObject: - addObjFieldsToLocalScope(c, t.n) - if t[0] == nil: break - t = t[0].skipTypes(skipPtrs) - -proc pushProcCon*(c: PContext; owner: PSym) = - rawPushProcCon(c, owner) - rawHandleSelf(c, owner) - const errCannotInstantiateX = "cannot instantiate: '$1'" @@ -377,7 +358,7 @@ proc generateInstance(c: PContext, fn: PSym, pt: TIdTable, addDecl(c, s) entry.concreteTypes[i] = s.typ inc i - rawPushProcCon(c, result) + pushProcCon(c, result) instantiateProcType(c, pt, result, info) for j in 1..= self.cap: resize(self) @@ -60,17 +58,17 @@ proc add*(self: var mystring; c: char) = inc self.len proc ensure(self: var mystring; newLen: int) = - if newLen >= cap: - cap = max((cap * 3) shr 1, newLen) - if cap > 0: - if data == nil: inc allocCount - data = cast[type(data)](realloc(data, cap + 1)) + if newLen >= self.cap: + self.cap = max((self.cap * 3) shr 1, newLen) + if self.cap > 0: + if self.data == nil: inc allocCount + self.data = cast[type(self.data)](realloc(self.data, self.cap + 1)) proc add*(self: var mystring; y: mystring) = - let newLen = len + y.len + let newLen = self.len + y.len ensure(self, newLen) - copyMem(addr data[len], y.data, y.data.len + 1) - len = newLen + copyMem(addr self.data[self.len], y.data, y.data.len + 1) + self.len = newLen proc create*(lit: string): mystring = let newLen = lit.len diff --git a/tests/usingstmt/tusingstatement.nim b/tests/misc/tcsharpusingstatement.nim similarity index 100% rename from tests/usingstmt/tusingstatement.nim rename to tests/misc/tcsharpusingstatement.nim diff --git a/tests/misc/tupcomingfeatures.nim b/tests/misc/tupcomingfeatures.nim deleted file mode 100644 index d37ce85cff..0000000000 --- a/tests/misc/tupcomingfeatures.nim +++ /dev/null @@ -1,35 +0,0 @@ -discard """ - output: '''0 -2 0 -0 -2''' -""" - -{.this: self.} - -type - Foo = object - a, b, x: int - -proc yay(self: Foo) = - echo a, " ", b, " ", x - -proc footest[T](self: var Foo, a: T) = - b = 1+a - yay() - -proc nongeneric(self: Foo) = - echo a, " ", b - -var ff: Foo -footest(ff, -3) -ff.nongeneric - -{.experimental.} -using - c: Foo - x, y: int - -proc usesSig(c) = - echo "yummy" - -proc foobar(c, y) = - echo "yay" diff --git a/tests/overload/tselfderef.nim b/tests/overload/tselfderef.nim deleted file mode 100644 index 96f1da42ad..0000000000 --- a/tests/overload/tselfderef.nim +++ /dev/null @@ -1,20 +0,0 @@ -discard """ -action: compile -""" - -# bug #4671 -{.experimental.} -{.this: self.} -type - SomeObj = object - f: int - -proc f(num: int) = - discard - -var intptr: ptr int -intptr.f() # compiles fine - -proc doSomething(self: var SomeObj) = - var pint: ptr int - pint.f() # Error: expression '.(pint, "f")' cannot be called diff --git a/tests/usingstmt/tthis.nim b/tests/usingstmt/tthis.nim deleted file mode 100644 index 83d75d08c7..0000000000 --- a/tests/usingstmt/tthis.nim +++ /dev/null @@ -1,15 +0,0 @@ - -# bug #4177 - -type - Parent = object of RootObj - parentField: int - Child = object of Parent - childField: int - -{.this: self.} -proc sumFields(self: Child): int = - result = parentField + childField # Error: undeclared identifier: 'parentField' - -proc sumFieldsWorks(self: Child): int = - result = self.parentField + childField diff --git a/tests/usingstmt/tusingstmt.nim b/tests/usingstmt/tusingstmt.nim new file mode 100644 index 0000000000..11803878ef --- /dev/null +++ b/tests/usingstmt/tusingstmt.nim @@ -0,0 +1,16 @@ +type + Foo = object + +using + c: Foo + x, y: int + +proc usesSig(c) = discard + +proc foobar(c, y) = discard + +usesSig(Foo()) +foobar(Foo(), 123) +doAssert not compiles(usesSig(123)) +doAssert not compiles(foobar(Foo(), Foo())) +doAssert not compiles(foobar(123, 123))