From f82b0838a1f055a8aa400d5e80ddb749fc6b236a Mon Sep 17 00:00:00 2001 From: Rangi <35663410+Rangi42@users.noreply.github.com> Date: Tue, 7 Jul 2026 00:42:09 -0400 Subject: [PATCH] Disallow minus sign before symbol name in bracketed macro arguments (#2015) This was being silently allowed but without actually negating the symbol's value --- src/asm/lexer.cpp | 15 +++++++++------ test/asm/macro-arg-negative-symbol.asm | 5 +++++ test/asm/macro-arg-negative-symbol.err | 5 +++++ test/asm/macro-arg-negative-symbol.out | 2 ++ 4 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 test/asm/macro-arg-negative-symbol.asm create mode 100644 test/asm/macro-arg-negative-symbol.err create mode 100644 test/asm/macro-arg-negative-symbol.out diff --git a/src/asm/lexer.cpp b/src/asm/lexer.cpp index 072d36b3..ef0a3153 100644 --- a/src/asm/lexer.cpp +++ b/src/asm/lexer.cpp @@ -535,13 +535,16 @@ static uint32_t readBracketedMacroArgNum() { int c = peek(); bool empty = false; bool symbolError = false; - bool negative = c == '-'; - if (negative) { - c = nextChar(); - } - - if (isDigit<10>(c)) { + if (c == '-' || isDigit<10>(c)) { + bool negative = c == '-'; + if (negative) { + c = nextChar(); + if (!isDigit<10>(c)) { + error("No digit after minus sign in bracketed macro argument"); + return 0; + } + } uint32_t n = readNumber<10>(bumpChar(), nullptr); if (n > INT32_MAX) { error("Number in bracketed macro argument is too large"); diff --git a/test/asm/macro-arg-negative-symbol.asm b/test/asm/macro-arg-negative-symbol.asm new file mode 100644 index 00000000..8583c26a --- /dev/null +++ b/test/asm/macro-arg-negative-symbol.asm @@ -0,0 +1,5 @@ +MACRO test + println \<2>, " vs ", \<-2> + println \<_NARG>, " vs ", \<-_NARG> +ENDM + test "hello", "goodbye" diff --git a/test/asm/macro-arg-negative-symbol.err b/test/asm/macro-arg-negative-symbol.err new file mode 100644 index 00000000..c0b151cf --- /dev/null +++ b/test/asm/macro-arg-negative-symbol.err @@ -0,0 +1,5 @@ +error: No digit after minus sign in bracketed macro argument + at macro-arg-negative-symbol.asm::test(3) <- macro-arg-negative-symbol.asm(5) +error: syntax error, unexpected end of line + at macro-arg-negative-symbol.asm::test(3) <- macro-arg-negative-symbol.asm(5) +Assembly aborted with 2 errors diff --git a/test/asm/macro-arg-negative-symbol.out b/test/asm/macro-arg-negative-symbol.out new file mode 100644 index 00000000..dc69ff03 --- /dev/null +++ b/test/asm/macro-arg-negative-symbol.out @@ -0,0 +1,2 @@ +goodbye vs hello +goodbye vs \ No newline at end of file