diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2020-10-15 12:52:30 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-15 12:52:30 +0200 |
commit | da4aa2e1fb8b0084fcf03b85edf4a5c1d0170856 (patch) | |
tree | 4d8fe99314d844bb7b44377568eebfd7b86e7f92 /compiler | |
parent | 42c180c665cb283bcb07e078a5ff91c69c84fa62 (diff) | |
download | Nim-da4aa2e1fb8b0084fcf03b85edf4a5c1d0170856.tar.gz |
renamed '=' to '=copy' [backport:1.2] (#15585)
* Assign hook name changed to `=copy` * Adapt destructors.rst * [nobackport] Duplicate tests for =copy hook * Fix tests * added a changelog entry Co-authored-by: Clyybber <darkmine956@gmail.com>
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/ast.nim | 2 | ||||
-rw-r--r-- | compiler/injectdestructors.nim | 4 | ||||
-rw-r--r-- | compiler/sempass2.nim | 3 | ||||
-rw-r--r-- | compiler/semstmts.nim | 4 |
4 files changed, 7 insertions, 6 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim index 8adbfa15c..f796e64c2 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -1331,7 +1331,7 @@ const MaxLockLevel* = 1000'i16 UnknownLockLevel* = TLockLevel(1001'i16) AttachedOpToStr*: array[TTypeAttachedOp, string] = [ - "=destroy", "=", "=sink", "=trace", "=dispose", "=deepcopy"] + "=destroy", "=copy", "=sink", "=trace", "=dispose", "=deepcopy"] proc `$`*(x: TLockLevel): string = if x.ord == UnspecifiedLockLevel.ord: result = "<unspecified>" diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index b18bcf34e..ea90299e2 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -235,7 +235,7 @@ template isUnpackedTuple(n: PNode): bool = proc checkForErrorPragma(c: Con; t: PType; ri: PNode; opname: string) = var m = "'" & opname & "' is not available for type <" & typeToString(t) & ">" - if opname == "=" and ri != nil: + if (opname == "=" or opname == "=copy") and ri != nil: m.add "; requires a copy because it's not the last read of '" m.add renderTree(ri) m.add '\'' @@ -319,7 +319,7 @@ proc genCopy(c: var Con; dest, ri: PNode): PNode = if tfHasOwned in t.flags and ri.kind != nkNilLit: # try to improve the error message here: if c.otherRead == nil: discard isLastRead(ri, c) - c.checkForErrorPragma(t, ri, "=") + c.checkForErrorPragma(t, ri, "=copy") result = c.genCopyNoCheck(dest, ri) proc genDiscriminantAsgn(c: var Con; s: var Scope; n: PNode): PNode = diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index 5eb464bb8..aa04f7451 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -809,7 +809,8 @@ proc trackCall(tracked: PEffects; n: PNode) = if a.kind == nkSym and a.sym.name.s.len > 0 and a.sym.name.s[0] == '=' and tracked.owner.kind != skMacro: - let opKind = find(AttachedOpToStr, a.sym.name.s.normalize) + var opKind = find(AttachedOpToStr, a.sym.name.s.normalize) + if a.sym.name.s.normalize == "=": opKind = attachedAsgn.int if opKind != -1: # rebind type bounds operations after createTypeBoundOps call let t = n[1].typ.skipTypes({tyAlias, tyVar}) diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 27cd9019f..b5e69c135 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -1732,7 +1732,7 @@ proc semOverride(c: PContext, s: PSym, n: PNode) = "signature for 'deepCopy' must be proc[T: ptr|ref](x: T): T") incl(s.flags, sfUsed) incl(s.flags, sfOverriden) - of "=", "=sink": + of "=", "=copy", "=sink": if s.magic == mAsgn: return incl(s.flags, sfUsed) incl(s.flags, sfOverriden) @@ -1754,7 +1754,7 @@ proc semOverride(c: PContext, s: PSym, n: PNode) = # attach these ops to the canonical tySequence obj = canonType(c, obj) #echo "ATTACHING TO ", obj.id, " ", s.name.s, " ", cast[int](obj) - let k = if name == "=": attachedAsgn else: attachedSink + let k = if name == "=" or name == "=copy": attachedAsgn else: attachedSink if obj.attachedOps[k] == s: discard "forward declared op" elif obj.attachedOps[k].isNil and tfCheckedForDestructor notin obj.flags: |