diff --git a/changelog.md b/changelog.md index 10d5510e65..f3ee98fb63 100644 --- a/changelog.md +++ b/changelog.md @@ -21,6 +21,8 @@ - The `unchecked` pragma was removed, instead use `system.UncheckedArray`. - The undocumented ``#? strongSpaces`` parsing mode has been removed. +- The `not` operator is now always a unary operator, this means that code like + ``assert not isFalse(3)`` compiles. #### Breaking changes in the standard library diff --git a/compiler/lexer.nim b/compiler/lexer.nim index 877369c2a5..76cb882970 100644 --- a/compiler/lexer.nim +++ b/compiler/lexer.nim @@ -966,7 +966,7 @@ proc getPrecedence*(tok: TToken, strongSpaces: bool): int = of '?': result = 2 else: considerAsgn(2) of tkDiv, tkMod, tkShl, tkShr: result = 9 - of tkIn, tkNotin, tkIs, tkIsnot, tkNot, tkOf, tkAs: result = 5 + of tkIn, tkNotin, tkIs, tkIsnot, tkOf, tkAs: result = 5 of tkDotDot: result = 6 of tkAnd: result = 4 of tkOr, tkXor, tkPtr, tkRef: result = 3 diff --git a/doc/manual.rst b/doc/manual.rst index e738061475..cb0194ba46 100644 --- a/doc/manual.rst +++ b/doc/manual.rst @@ -514,6 +514,9 @@ are used for other notational purposes. ``*:`` is as a special case treated as the two tokens `*`:tok: and `:`:tok: (to support ``var v*: T``). +The ``not`` keyword is always a unary operator, ``a not b`` is parsed +as ``a(not b)``, not as ``(a) not (b)``. + Other tokens ------------ diff --git a/tests/parser/tprecedence.nim b/tests/parser/tprecedence.nim index d586f14a3c..cdf4ad3eed 100644 --- a/tests/parser/tprecedence.nim +++ b/tests/parser/tprecedence.nim @@ -19,3 +19,8 @@ proc foo[S, T](x: S, y: T): T = x & y proc bar[T](x: T): T = x echo "def".foo[:string, string]("abc"), " ", 4.bar[:int] + +# bug #9574 +proc isFalse(a: int): bool = false + +assert not isFalse(3)