aboutsummaryrefslogtreecommitdiff
path: root/tccpp.c
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2017-04-15 19:24:13 +0200
committerMichael Matz <matz@suse.de>2017-04-15 19:34:55 +0200
commit328b826e8a43ed39f9eebb8493cc6abea2ddac1c (patch)
tree11130f2851dbd99522cca765b91d5f012a431cdb /tccpp.c
parent536ed76d5a69d8e3c0e247d6557f5942818cb253 (diff)
downloadtinycc-328b826e8a43ed39f9eebb8493cc6abea2ddac1c.tar.gz
tinycc-328b826e8a43ed39f9eebb8493cc6abea2ddac1c.tar.bz2
tccpp: Fix corner case of fnlike macro invocation
Arg substitution leaves placeholder marker in the stream for empty arguments. Those need to be skipped when searching for a fnlike macro invocation in the replacement list itself. See testcase.
Diffstat (limited to 'tccpp.c')
-rw-r--r--tccpp.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/tccpp.c b/tccpp.c
index bdf2815..7e5cdcf 100644
--- a/tccpp.c
+++ b/tccpp.c
@@ -3023,7 +3023,7 @@ static int next_argstream(Sym **nested_list, int can_read_stream, TokenString *w
if (macro_ptr) {
p = macro_ptr, t = *p;
if (ws_str) {
- while (is_space(t) || TOK_LINEFEED == t)
+ while (is_space(t) || TOK_LINEFEED == t || TOK_PLCHLDR == t)
tok_str_add(ws_str, t), t = *++p;
}
if (t == 0 && can_read_stream) {
@@ -3152,7 +3152,9 @@ static int macro_subst_tok(
} else {
tok_str_free_str(ws_str.str);
}
- next_nomacro(); /* eat '(' */
+ do {
+ next_nomacro(); /* eat '(' */
+ } while (tok == TOK_PLCHLDR);
/* argument macro */
args = NULL;