parent
10bd7d8fa0
commit
9b8afd1dbb
2 changed files with 51 additions and 0 deletions
|
|
@ -492,6 +492,10 @@ iterator fieldValuePairs(n: PNode): tuple[memberSym, valueSym: PNode] =
|
||||||
|
|
||||||
proc genComputedGoto(p: BProc; n: PNode) =
|
proc genComputedGoto(p: BProc; n: PNode) =
|
||||||
# first pass: Generate array of computed labels:
|
# 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 casePos = -1
|
||||||
var arraySize: int
|
var arraySize: int
|
||||||
for i in 0..<n.len:
|
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())
|
||||||
Loading…
Add table
Add a link
Reference in a new issue