BR3392200: preproc - Fix dangling paste term
authorCyrill Gorcunov <gorcunov@gmail.com>
Mon, 27 Feb 2012 07:11:33 +0000 (11:11 +0400)
committerCyrill Gorcunov <gorcunov@gmail.com>
Mon, 27 Feb 2012 07:12:06 +0000 (11:12 +0400)
In case if there a production

{tok},{%+},{whitespace}*

the preprocessor does not delete
ending paste+spaces tokens. Fix it.

http://bugzilla.nasm.us/show_bug.cgi?id=3392200

Reported-by: KO Myung-Hun <komh@chollian.net>
Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
preproc.c

index b21335e..4927772 100644 (file)
--- a/preproc.c
+++ b/preproc.c
@@ -4026,6 +4026,9 @@ static bool paste_tokens(Token **head, const struct tokseq_match *m,
     char *tmp;
     int i;
 
+    nasm_dump_stream(*head);
+    nasm_dump_token(*head);
+
     /* Now handle token pasting... */
     paste_head = NULL;
     tail = head;
@@ -4046,8 +4049,13 @@ static bool paste_tokens(Token **head, const struct tokseq_match *m,
                 while (t && (t->type == TOK_WHITESPACE ||
                              t->type == TOK_PASTE))
                     t = *tail = delete_Token(t);
-                if (!paste_head || !t)
-                    break;      /* Nothing to paste with */
+                if (!t) { /* Dangling %+ term */
+                    if (paste_head)
+                        (*paste_head)->next = NULL;
+                    else
+                        *head = NULL;
+                    return did_paste;
+                }
                 tail = paste_head;
                 t = *tail;
                 tt = t->next;