summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/injectdestructors.nim5
-rw-r--r--tests/arc/t14383.nim16
2 files changed, 19 insertions, 2 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim
index bac47b3d6..fcaa3c76a 100644
--- a/compiler/injectdestructors.nim
+++ b/compiler/injectdestructors.nim
@@ -699,8 +699,9 @@ proc p(n: PNode; c: var Con; s: var Scope; mode: ProcessMode): PNode =
     elif n.kind in {nkObjDownConv, nkObjUpConv}:
       result = copyTree(n)
       result[0] = p(n[0], c, s, sinkArg)
-    elif n.typ == nil:
-      # 'raise X' can be part of a 'case' expression. Deal with it here:
+    elif n.typ == nil or n.typ.skipTypes({tyGenericInst, tyAlias, tySink, tyVar}).kind == tyOpenArray:
+      # 'raise X' can be part of a 'case' expression. Deal with it here.
+      # openarrays require perfect forwarding
       result = p(n, c, s, normal)
     else:
       # copy objects that are not temporary but passed to a 'sink' parameter
diff --git a/tests/arc/t14383.nim b/tests/arc/t14383.nim
index 115cbf426..742088937 100644
--- a/tests/arc/t14383.nim
+++ b/tests/arc/t14383.nim
@@ -3,6 +3,7 @@ discard """
   output: '''
 hello
 hello
+@[4, 3, 2, 1]
 '''
 """
 
@@ -11,3 +12,18 @@ import dmodule
 var val = parseMinValue()
 if val.kind == minDictionary:
   echo val
+
+
+#------------------------------------------------------------------------------
+# Issue #15035
+#------------------------------------------------------------------------------
+
+proc countRun(lst: sink openArray[int]): int =
+  discard
+
+proc timSort(lst: var openArray[int]) = 
+  let run = countRun(lst)
+
+var a = @[4, 3, 2, 1]
+timSort(a)
+echo a
\ No newline at end of file