diff options
author | Cyrill Gorcunov <gorcunov@gmail.com> | 2013-02-04 01:24:54 +0400 |
---|---|---|
committer | Cyrill Gorcunov <gorcunov@gmail.com> | 2013-02-04 10:18:21 +0400 |
commit | 8b5c9fba4ea12437ec4fe28d3e6675880ca92d59 (patch) | |
tree | ccfd4141301b534f827074d73a2b690fe5dc50d1 | |
parent | 7c88b3a9d7719e53cc408d3d9aeba548b8931337 (diff) | |
download | nasm-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.c | 29 |
1 files changed, 25 insertions, 4 deletions
@@ -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); |