diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2023-06-27 22:42:48 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-27 22:42:48 +0200 |
commit | 427ad17161a19ecf8d0e2fc932064e18226210fa (patch) | |
tree | 970b0bfa657ecada1c87c0fdc5a6869d4a1576c6 | |
parent | 9616762cfe7a6d1607ba7d00e00537e9620aff50 (diff) | |
download | Nim-427ad17161a19ecf8d0e2fc932064e18226210fa.tar.gz |
fixes #22001 (#22177)
* fixes #22001 * added test case
-rw-r--r-- | compiler/dfa.nim | 6 | ||||
-rw-r--r-- | tests/arc/tmove_regression.nim | 22 |
2 files changed, 26 insertions, 2 deletions
diff --git a/compiler/dfa.nim b/compiler/dfa.nim index d145e31c3..b21fcf473 100644 --- a/compiler/dfa.nim +++ b/compiler/dfa.nim @@ -264,7 +264,8 @@ proc genBreakOrRaiseAux(c: var Con, i: int, n: PNode) = c.blocks[i].raiseFixups.add lab1 else: var trailingFinales: seq[PNode] - if c.inTryStmt > 0: #Ok, we are in a try, lets see which (if any) try's we break out from: + if c.inTryStmt > 0: + # Ok, we are in a try, lets see which (if any) try's we break out from: for b in countdown(c.blocks.high, i): if c.blocks[b].isTryBlock: trailingFinales.add c.blocks[b].finale @@ -385,7 +386,8 @@ proc genCall(c: var Con; n: PNode) = # Pass by 'out' is a 'must def'. Good enough for a move optimizer. genDef(c, n[i]) # every call can potentially raise: - if false: # c.inTryStmt > 0 and canRaiseConservative(n[0]): + if c.inTryStmt > 0 and canRaiseConservative(n[0]): + inc c.interestingInstructions # we generate the instruction sequence: # fork lab1 # goto exceptionHandler (except or finally) diff --git a/tests/arc/tmove_regression.nim b/tests/arc/tmove_regression.nim new file mode 100644 index 000000000..7d9a867c3 --- /dev/null +++ b/tests/arc/tmove_regression.nim @@ -0,0 +1,22 @@ +discard """ + output: '''/1/2 +/1 +/ +''' +"""" + +# bug #22001 + +import std / [os, strutils] + +proc finOp2(path, name: string): (string, File) = # Find & open FIRST `name` + var current = path + while true: + if current.isRootDir: break # <- current=="" => current.isRootDir + current = current.parentDir + let dir = current + echo dir.replace('\\', '/') # Commenting out try/except below hides bug + try: result[0] = dir/name; result[1] = open(result[0]); return + except CatchableError: discard + +discard finOp2("/1/2/3", "4") # All same if this->inside a proc |