summary refs log tree commit diff stats
path: root/tests/arc
diff options
context:
space:
mode:
authorBung <crc32@qq.com>2022-11-06 18:47:35 +0800
committerGitHub <noreply@github.com>2022-11-06 11:47:35 +0100
commitfdc8dd41288c78052c21796b7e65e37cba71d316 (patch)
tree87b3cb8b2c606a953789af4bc79cefba5a905aa7 /tests/arc
parent93b085a57ad28c71056dd3da6c4daa56ef4713c4 (diff)
downloadNim-fdc8dd41288c78052c21796b7e65e37cba71d316.tar.gz
Arc global (#20768)
* temp

* unsure

* fix condition

* port macro arc runable examples to one file

* trigger doc ci

* fix

Co-authored-by: ringabout <43030857+ringabout@users.noreply.github.com>
Diffstat (limited to 'tests/arc')
-rw-r--r--tests/arc/tarc_macro.nim46
-rw-r--r--tests/arc/tarcmisc.nim2
2 files changed, 47 insertions, 1 deletions
diff --git a/tests/arc/tarc_macro.nim b/tests/arc/tarc_macro.nim
new file mode 100644
index 000000000..ea7d279fd
--- /dev/null
+++ b/tests/arc/tarc_macro.nim
@@ -0,0 +1,46 @@
+import macros
+
+var destroyCalled = false
+macro bar() =
+  let s = newTree(nnkAccQuoted, ident"=destroy")
+  # let s = ident"`=destroy`" # this would not work
+  result = quote do:
+    type Foo = object
+    # proc `=destroy`(a: var Foo) = destroyCalled = true # this would not work
+    proc `s`(a: var Foo) = destroyCalled = true
+    block:
+      let a = Foo()
+bar()
+doAssert destroyCalled
+
+# custom `op`
+var destroyCalled2 = false
+macro bar(ident) =
+  var x = 1.5
+  result = quote("@") do:
+    type Foo = object
+    let `@ident` = 0 # custom op interpolated symbols need quoted (``)
+    proc `=destroy`(a: var Foo) =
+      doAssert @x == 1.5
+      doAssert compiles(@x == 1.5)
+      let b1 = @[1,2]
+      let b2 = @@[1,2]
+      doAssert $b1 == "[1, 2]"
+      doAssert $b2 == "@[1, 2]"
+      destroyCalled2 = true
+    block:
+      let a = Foo()
+bar(someident)
+doAssert destroyCalled2
+
+proc `&%`(x: int): int = 1
+proc `&%`(x, y: int): int = 2
+
+macro bar2() =
+  var x = 3
+  result = quote("&%") do:
+    var y = &%x # quoting operator
+    doAssert &%&%y == 1 # unary operator => need to escape
+    doAssert y &% y == 2 # binary operator => no need to escape
+    doAssert y == 3
+bar2()
\ No newline at end of file
diff --git a/tests/arc/tarcmisc.nim b/tests/arc/tarcmisc.nim
index 567daf982..3160d8a4d 100644
--- a/tests/arc/tarcmisc.nim
+++ b/tests/arc/tarcmisc.nim
@@ -124,7 +124,7 @@ proc test(count: int) =
 test(3)
 
 proc test2(count: int) =
-  #block: #XXX: Fails with block currently
+  block: #XXX: Fails with block currently
     var v {.global.} = newVariable(20)
 
     var count = count - 1