diff --git a/src/asm/lexer.cpp b/src/asm/lexer.cpp index a485b19a..ef65e7e7 100644 --- a/src/asm/lexer.cpp +++ b/src/asm/lexer.cpp @@ -724,7 +724,7 @@ static uint32_t readBracketedMacroArgNum(void) } if (i == sizeof(symName)) { - warning(WARNING_LONG_STR, "Bracketed symbol name too long\n"); + warning(WARNING_LONG_STR, "Bracketed symbol name too long, got truncated\n"); i--; } symName[i] = '\0'; @@ -1371,10 +1371,14 @@ static char const *readInterpolation(size_t depth) break; } else if (c == ':' && !fmt_IsFinished(&fmt)) { // Format spec, only once shiftChar(); + if (i == sizeof(symName)) { + warning(WARNING_LONG_STR, "Format spec too long, got truncated\n"); + i = sizeof(symName) - 1; + } + symName[i] = '\0'; for (size_t j = 0; j < i; j++) fmt_UseCharacter(&fmt, symName[j]); fmt_FinishCharacters(&fmt); - symName[i] = '\0'; if (!fmt_IsValid(&fmt)) error("Invalid format spec '%s'\n", symName); i = 0; // Now that format has been set, restart at beginning of string @@ -1386,7 +1390,7 @@ static char const *readInterpolation(size_t depth) } if (i == sizeof(symName)) { - warning(WARNING_LONG_STR, "Interpolated symbol name too long\n"); + warning(WARNING_LONG_STR, "Interpolated symbol name too long, got truncated\n"); i--; } symName[i] = '\0'; diff --git a/test/asm/bracketed-macro-args.err b/test/asm/bracketed-macro-args.err index a7dd5f2c..dc451831 100644 --- a/test/asm/bracketed-macro-args.err +++ b/test/asm/bracketed-macro-args.err @@ -9,7 +9,7 @@ error: bracketed-macro-args.asm(33) -> bracketed-macro-args.asm::bad(29): error: bracketed-macro-args.asm(33) -> bracketed-macro-args.asm::bad(30): Macro argument '\<2>' not defined warning: bracketed-macro-args.asm(39) -> bracketed-macro-args.asm::toolong(36): [-Wlong-string] - Bracketed symbol name too long + Bracketed symbol name too long, got truncated error: bracketed-macro-args.asm(39) -> bracketed-macro-args.asm::toolong(36): Bracketed symbol "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstu" does not exist error: Assembly aborted (6 errors)! diff --git a/test/asm/long-format-spec.asm b/test/asm/long-format-spec.asm new file mode 100644 index 00000000..a88a1c4f --- /dev/null +++ b/test/asm/long-format-spec.asm @@ -0,0 +1,3 @@ +DEF n EQU 42 +; the format spec is truncated to "000...009", omitting the "x", so this prints "000000042" not "00000002a" +PRINTLN "{000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009x:n}" diff --git a/test/asm/long-format-spec.err b/test/asm/long-format-spec.err new file mode 100644 index 00000000..7f3adc8a --- /dev/null +++ b/test/asm/long-format-spec.err @@ -0,0 +1,5 @@ +warning: long-format-spec.asm(3): [-Wlong-string] + Format spec too long, got truncated +error: long-format-spec.asm(3): + Invalid format spec '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009' +error: Assembly aborted (1 error)! diff --git a/test/asm/long-format-spec.out b/test/asm/long-format-spec.out new file mode 100644 index 00000000..595d3c17 --- /dev/null +++ b/test/asm/long-format-spec.out @@ -0,0 +1 @@ +000000042