summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrill Gorcunov <gorcunov@gmail.com>2013-02-04 01:24:54 +0400
committerCyrill Gorcunov <gorcunov@gmail.com>2013-02-04 10:18:21 +0400
commit8b5c9fba4ea12437ec4fe28d3e6675880ca92d59 (patch)
treeccfd4141301b534f827074d73a2b690fe5dc50d1
parent7c88b3a9d7719e53cc408d3d9aeba548b8931337 (diff)
downloadnasm-8b5c9fba4ea12437ec4fe28d3e6675880ca92d59.tar.gz
BR3392240: preproc: Don't fail on pasting of space expanded rvalue tokens
Reported-by: KO Myung-Hun <komh@chollian.net> Tested-by: KO Myung-Hun <komh@chollian.net> Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
-rw-r--r--preproc.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/preproc.c b/preproc.c
index 9d659174..0ca360ed 100644
--- a/preproc.c
+++ b/preproc.c
@@ -3640,14 +3640,35 @@ static bool paste_tokens(Token **head, const struct tokseq_match *m,
if (!pasted)
pasted = true;
- /* No ending token */
- if (!next)
- error(ERR_FATAL, "No rvalue found on pasting");
-
/* Left pasting token is start of line */
if (!prev_nonspace)
error(ERR_FATAL, "No lvalue found on pasting");
+ /*
+ * No ending token, this might happen in two
+ * cases
+ *
+ * 1) There indeed no right token at all
+ * 2) There is a bare "%define ID" statement,
+ * and @ID does expand to whitespace.
+ *
+ * So technically we need to do a grammar analysis
+ * in another stage of parsing, but for now lets don't
+ * change the behaviour people used to. Simply allow
+ * whitespace after paste token.
+ */
+ if (!next) {
+ /*
+ * Zap ending space tokens and that's all.
+ */
+ tok = (*prev_nonspace)->next;
+ while (tok_type_(tok, TOK_WHITESPACE))
+ tok = delete_Token(tok);
+ tok = *prev_nonspace;
+ tok->next = NULL;
+ break;
+ }
+
tok = *prev_nonspace;
while (tok_type_(tok, TOK_WHITESPACE))
tok = delete_Token(tok);