From 9fd0c0297f0a2ccdfa1345bf65b308eaa8d2c8f0 Mon Sep 17 00:00:00 2001 From: Rangi42 Date: Mon, 27 Apr 2026 16:57:54 +0200 Subject: [PATCH] Fix invalid character in bracketed macro argument The invalid character should not be consumed by `shiftChar()`. --- src/asm/lexer.cpp | 6 ++++-- test/asm/character-escapes.out | 5 +++-- test/asm/empty-raw-identifier.out | 2 +- test/asm/invalid-bracketed-macro-arg.asm | 6 ++++++ test/asm/invalid-bracketed-macro-arg.err | 3 +++ test/asm/invalid-bracketed-macro-arg.out | 2 ++ test/asm/invalid-macro-arg-character.err | 2 +- 7 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 test/asm/invalid-bracketed-macro-arg.asm create mode 100644 test/asm/invalid-bracketed-macro-arg.err create mode 100644 test/asm/invalid-bracketed-macro-arg.out diff --git a/src/asm/lexer.cpp b/src/asm/lexer.cpp index b710b2b1..f33e68c3 100644 --- a/src/asm/lexer.cpp +++ b/src/asm/lexer.cpp @@ -582,11 +582,13 @@ static uint32_t readBracketedMacroArgNum() { empty = true; } - c = bumpChar(); + c = peek(); if (c != '>') { error("Invalid character %s in bracketed macro argument", printChar(c)); return 0; - } else if (empty) { + } + shiftChar(); + if (empty) { error("Empty bracketed macro argument"); return 0; } else if (num == 0 && !symbolError) { diff --git a/test/asm/character-escapes.out b/test/asm/character-escapes.out index a8d6e32a..47710f92 100644 --- a/test/asm/character-escapes.out +++ b/test/asm/character-escapes.out @@ -3,5 +3,6 @@ ( ) illegal character escape z? -invalid character n>? -invalid character >? +invalid character +>? +invalid character >? diff --git a/test/asm/empty-raw-identifier.out b/test/asm/empty-raw-identifier.out index bd8297be..0e370139 100644 --- a/test/asm/empty-raw-identifier.out +++ b/test/asm/empty-raw-identifier.out @@ -1,2 +1,2 @@ all args: a,#b,c,1,#2,3 -bad args: >, > +bad args: ?>, > diff --git a/test/asm/invalid-bracketed-macro-arg.asm b/test/asm/invalid-bracketed-macro-arg.asm new file mode 100644 index 00000000..d18208f0 --- /dev/null +++ b/test/asm/invalid-bracketed-macro-arg.asm @@ -0,0 +1,6 @@ +MACRO m + println "¿", """\<_NARG""", "?" + println """done!""" +ENDM + + m one, two, three diff --git a/test/asm/invalid-bracketed-macro-arg.err b/test/asm/invalid-bracketed-macro-arg.err new file mode 100644 index 00000000..82414e7c --- /dev/null +++ b/test/asm/invalid-bracketed-macro-arg.err @@ -0,0 +1,3 @@ +error: Invalid character '"' in bracketed macro argument + at invalid-bracketed-macro-arg.asm::m(2) <- invalid-bracketed-macro-arg.asm(6) +Assembly aborted with 1 error diff --git a/test/asm/invalid-bracketed-macro-arg.out b/test/asm/invalid-bracketed-macro-arg.out new file mode 100644 index 00000000..bd35ea36 --- /dev/null +++ b/test/asm/invalid-bracketed-macro-arg.out @@ -0,0 +1,2 @@ +¿? +done! diff --git a/test/asm/invalid-macro-arg-character.err b/test/asm/invalid-macro-arg-character.err index a794235a..caec1712 100644 --- a/test/asm/invalid-macro-arg-character.err +++ b/test/asm/invalid-macro-arg-character.err @@ -1,5 +1,5 @@ error: Invalid character '!' in bracketed macro argument at invalid-macro-arg-character.asm(1) -error: syntax error, unexpected > +error: syntax error, unexpected ! at invalid-macro-arg-character.asm(1) Assembly aborted with 2 errors