From 48697dc5bb5d23761e9b1679f064d03de4e7bdc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20D=C3=B6ring?= Date: Thu, 19 Jul 2018 22:42:48 +0200 Subject: [PATCH] added test case for `or` operator --- lib/core/macros.nim | 6 +++--- tests/macros/tmacro1.nim | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/core/macros.nim b/lib/core/macros.nim index e4424690a4..a3b02de5f5 100644 --- a/lib/core/macros.nim +++ b/lib/core/macros.nim @@ -176,7 +176,7 @@ proc `[]=`*(n: NimNode, i: BackwardsIndex, child: NimNode) = ## set `n`'s `i`'th child to `child`. n[n.len - i.int] = child -template `or`*(a,b: NimNode): NimNode = +template `or`*(x, y: NimNode): NimNode = ## Evalutuate ``a`` and when it is not an empty node, return return ## it. Otherwise evaluate to ``b``. Can be used to chain several ## expressions that evaluates to the first expression that is not @@ -186,11 +186,11 @@ template `or`*(a,b: NimNode): NimNode = ## ## let node = mightBeEmpty() or mightAlsoBeEmpty() or fallbackNode - let arg = a + let arg = x if arg != nil and arg.kind != nnkEmpty: arg else: - b + y proc add*(father, child: NimNode): NimNode {.magic: "NAdd", discardable, noSideEffect, locks: 0.} diff --git a/tests/macros/tmacro1.nim b/tests/macros/tmacro1.nim index ac2bf90945..5388e861c0 100644 --- a/tests/macros/tmacro1.nim +++ b/tests/macros/tmacro1.nim @@ -79,3 +79,17 @@ static: assert fooSym.kind in {nnkOpenSymChoice, nnkClosedSymChoice} assert fooSym.eqIdent("fOO") assertNot fooSym.eqIdent("bar") + + var empty: NimNode + var myLit = newLit("str") + + assert( (empty or myLit) == myLit ) + + empty = newEmptyNode() + + assert( (empty or myLit) == myLit ) + + proc bottom(): NimNode = + quit("may not be evaluated") + + assert( (myLit or bottom()) == myLit )