From 8b5c9fba4ea12437ec4fe28d3e6675880ca92d59 Mon Sep 17 00:00:00 2001 From: Cyrill Gorcunov Date: Mon, 4 Feb 2013 01:24:54 +0400 Subject: [PATCH] BR3392240: preproc: Don't fail on pasting of space expanded rvalue tokens Reported-by: KO Myung-Hun Tested-by: KO Myung-Hun Signed-off-by: Cyrill Gorcunov --- preproc.c | 29 +++++++++++++++++++++++++---- 1 file 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); -- 2.11.4.GIT