From 63d15ac8c901cab95c3d37abad2a97c7020a61d7 Mon Sep 17 00:00:00 2001 From: Rangi Date: Tue, 23 Feb 2021 23:25:58 -0500 Subject: [PATCH] append_yylval_tzString should always evaluate its argument Fixes #762 --- src/asm/lexer.c | 5 +++-- test/asm/long-string-constant.asm | 13 +++++++++++++ test/asm/long-string-constant.err | 4 ++++ test/asm/long-string-constant.out | 8 ++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 test/asm/long-string-constant.asm create mode 100644 test/asm/long-string-constant.err create mode 100644 test/asm/long-string-constant.out diff --git a/src/asm/lexer.c b/src/asm/lexer.c index a52ede9f4..5f74c0ebe 100644 --- a/src/asm/lexer.c +++ b/src/asm/lexer.c @@ -1455,15 +1455,16 @@ static char const *readInterpolation(void) } #define append_yylval_tzString(c) do { \ + char v = (c); /* Evaluate c exactly once in case it has side effects. */ \ if (i < sizeof(yylval.tzString)) \ - yylval.tzString[i++] = (c); \ + yylval.tzString[i++] = v; \ } while (0) static size_t appendEscapedSubstring(char const *str, size_t i) { /* Copy one extra to flag overflow */ while (*str) { - int c = *str++; + char c = *str++; /* Escape characters that need escaping */ switch (c) { diff --git a/test/asm/long-string-constant.asm b/test/asm/long-string-constant.asm new file mode 100644 index 000000000..4f699b86d --- /dev/null +++ b/test/asm/long-string-constant.asm @@ -0,0 +1,13 @@ + +println """This paragraph has exactly 257--that's two hundred and +fifty-seven--characters altogether. That's just enough for its last +two characters to be truncated by rgbasm's lexer, since it can't +handle more than 255-character strings. The final two won't print: !?""" + +mac: MACRO + println "\1" ; x1 + println "\1\1\1\1\1\1" ; x6 +ENDM + + mac Hello! ; 6x6 = 36 + mac This sentence spans forty-three characters. ; 43x6 = 258 diff --git a/test/asm/long-string-constant.err b/test/asm/long-string-constant.err new file mode 100644 index 000000000..b2154e3fa --- /dev/null +++ b/test/asm/long-string-constant.err @@ -0,0 +1,4 @@ +warning: long-string-constant.asm(5): [-Wlong-string] + String constant too long +warning: long-string-constant.asm(13) -> long-string-constant.asm::mac(9): [-Wlong-string] + String constant too long diff --git a/test/asm/long-string-constant.out b/test/asm/long-string-constant.out new file mode 100644 index 000000000..d51bccaab --- /dev/null +++ b/test/asm/long-string-constant.out @@ -0,0 +1,8 @@ +This paragraph has exactly 257--that's two hundred and +fifty-seven--characters altogether. That's just enough for its last +two characters to be truncated by rgbasm's lexer, since it can't +handle more than 255-character strings. The final two won't print: +Hello! +Hello!Hello!Hello!Hello!Hello!Hello! +This sentence spans forty-three characters. +This sentence spans forty-three characters.This sentence spans forty-three characters.This sentence spans forty-three characters.This sentence spans forty-three characters.This sentence spans forty-three characters.This sentence spans forty-three characte