destructors: don't produce stupid code for 'cast' (#14208) [backport:1.2]

* destructors: don't produce stupid code for 'cast'

* fixes #14207
This commit is contained in:
Andreas Rumpf 2020-05-04 07:43:22 +02:00 • committed by GitHub
commit b6fb609e0d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 4 deletions

View file

@ -541,8 +541,8 @@ template genNoReturn(c: var Con; n: PNode) =
c.code.add Instr(n: n, kind: goto, dest: high(int) - c.code.len) c.code.add Instr(n: n, kind: goto, dest: high(int) - c.code.len)
proc genRaise(c: var Con; n: PNode) = proc genRaise(c: var Con; n: PNode) =
genJoins(c, n)
gen(c, n[0]) gen(c, n[0])
genJoins(c, n)
if c.inTryStmt > 0: if c.inTryStmt > 0:
c.tryStmtFixups.add c.gotoI(n) c.tryStmtFixups.add c.gotoI(n)
else: else:
@ -553,11 +553,11 @@ proc genImplicitReturn(c: var Con) =
gen(c, c.owner.ast[resultPos]) gen(c, c.owner.ast[resultPos])
proc genReturn(c: var Con; n: PNode) = proc genReturn(c: var Con; n: PNode) =
genJoins(c, n)
if n[0].kind != nkEmpty: if n[0].kind != nkEmpty:
gen(c, n[0]) gen(c, n[0])
else: else:
genImplicitReturn(c) genImplicitReturn(c)
genJoins(c, n)
genNoReturn(c, n) genNoReturn(c, n)
const const

View file

@ -314,7 +314,7 @@ proc genDiscriminantAsgn(c: var Con; n: PNode): PNode =
# discriminator is ordinal value that doesn't need sink destroy # discriminator is ordinal value that doesn't need sink destroy
# but fields within active case branch might need destruction # but fields within active case branch might need destruction
# tmp to support self assignments # tmp to support self assignments
let tmp = getTemp(c, n[1].typ, n.info) let tmp = getTemp(c, n[1].typ, n.info)
c.addTopVar(tmp) c.addTopVar(tmp)
@ -329,7 +329,7 @@ proc genDiscriminantAsgn(c: var Con; n: PNode): PNode =
if hasDestructor(objType): if hasDestructor(objType):
if objType.attachedOps[attachedDestructor] != nil and if objType.attachedOps[attachedDestructor] != nil and
sfOverriden in objType.attachedOps[attachedDestructor].flags: sfOverriden in objType.attachedOps[attachedDestructor].flags:
localError(c.graph.config, n.info, errGenerated, """Assignment to discriminant for object's with user defined destructor is not supported, object must have default destructor. localError(c.graph.config, n.info, errGenerated, """Assignment to discriminant for object's with user defined destructor is not supported, object must have default destructor.
It is best to factor out piece of object that needs custom destructor into separate object or not use discriminator assignment""") It is best to factor out piece of object that needs custom destructor into separate object or not use discriminator assignment""")
result.add newTree(nkFastAsgn, le, tmp) result.add newTree(nkFastAsgn, le, tmp)
return return
@ -957,6 +957,10 @@ proc p(n: PNode; c: var Con; mode: ProcessMode): PNode =
for i in 0..<n.len: for i in 0..<n.len:
result[i] = p(n[i], c, mode) result[i] = p(n[i], c, mode)
inc c.hasUnstructuredCf inc c.hasUnstructuredCf
of nkCast:
result = shallowCopy(n)
result[0] = n[0]
result[1] = p(n[1], c, mode)
else: else:
result = shallowCopy(n) result = shallowCopy(n)
for i in 0..<n.len: for i in 0..<n.len:

View file

@ -1,5 +1,6 @@
discard """ discard """
output: ''' output: '''
123xyzabc
destroyed: false destroyed: false
destroyed: false destroyed: false
closed closed
@ -8,6 +9,19 @@ destroying variable
cmd: "nim c --gc:arc $file" cmd: "nim c --gc:arc $file"
""" """
proc takeSink(x: sink string): bool = true
proc b(x: sink string): string =
if takeSink(x):
return x & "abc"
proc bbb(inp: string) =
let y = inp & "xyz"
echo b(y)
bbb("123")
# bug #13691 # bug #13691
type Variable = ref object type Variable = ref object
value: int value: int