mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
@@ -492,6 +492,10 @@ iterator fieldValuePairs(n: PNode): tuple[memberSym, valueSym: PNode] =
|
||||
|
||||
proc genComputedGoto(p: BProc; n: PNode) =
|
||||
# first pass: Generate array of computed labels:
|
||||
|
||||
# flatten the loop body because otherwise let and var sections
|
||||
# wrapped inside stmt lists by inject destructors won't be recognised
|
||||
let n = n.flattenStmts()
|
||||
var casePos = -1
|
||||
var arraySize: int
|
||||
for i in 0..<n.len:
|
||||
|
||||
47
tests/casestmt/t12785.nim
Normal file
47
tests/casestmt/t12785.nim
Normal file
@@ -0,0 +1,47 @@
|
||||
discard """
|
||||
cmd: '''nim c --newruntime $file'''
|
||||
output: '''copied
|
||||
copied
|
||||
2
|
||||
copied
|
||||
copied
|
||||
2
|
||||
destroyed
|
||||
destroyed'''
|
||||
"""
|
||||
|
||||
type
|
||||
ObjWithDestructor = object
|
||||
a: int
|
||||
proc `=destroy`(self: var ObjWithDestructor) =
|
||||
echo "destroyed"
|
||||
|
||||
proc `=`(self: var ObjWithDestructor, other: ObjWithDestructor) =
|
||||
echo "copied"
|
||||
|
||||
proc test(a: range[0..1], arg: ObjWithDestructor) =
|
||||
var iteration = 0
|
||||
while true:
|
||||
{.computedGoto.}
|
||||
|
||||
let
|
||||
b = int(a) * 2
|
||||
c = a
|
||||
d = arg
|
||||
e = arg
|
||||
|
||||
discard c
|
||||
discard d
|
||||
discard e
|
||||
|
||||
inc iteration
|
||||
|
||||
case a
|
||||
of 0:
|
||||
assert false
|
||||
of 1:
|
||||
echo b
|
||||
if iteration == 2:
|
||||
break
|
||||
|
||||
test(1, ObjWithDestructor())
|
||||
Reference in New Issue
Block a user