diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-03-30 15:00:52 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-03-30 15:00:52 +0000 |
commit | 4514949a22403811d4d4de86cd83a29f2e8693db (patch) | |
tree | bc2a897e2a2dd4b1d895bf4aa97e109f744873b2 /libcpp/macro.c | |
parent | a59b7afbb72532164df78d27cbd69d79025cde63 (diff) | |
download | gcc-4514949a22403811d4d4de86cd83a29f2e8693db.tar.gz |
PR target/39558
* macro.c (cpp_get_token): If macro_to_expand returns NULL
and used some tokens, add CPP_PADDING before next token.
* gcc.target/powerpc/altivec-29.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145297 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp/macro.c')
-rw-r--r-- | libcpp/macro.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/libcpp/macro.c b/libcpp/macro.c index 3a20c36ed39..fc70be67403 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -1260,10 +1260,36 @@ cpp_get_token (cpp_reader *pfile) /* Conditional macros require that a predicate be evaluated first. */ - if (((!(node->flags & NODE_CONDITIONAL)) - || (pfile->cb.macro_to_expand - && (node = pfile->cb.macro_to_expand (pfile, result)))) - && (ret = enter_macro_context (pfile, node, result))) + if ((node->flags & NODE_CONDITIONAL) != 0) + { + if (pfile->cb.macro_to_expand) + { + bool whitespace_after; + const cpp_token *peek_tok = cpp_peek_token (pfile, 0); + + whitespace_after = (peek_tok->type == CPP_PADDING + || (peek_tok->flags & PREV_WHITE)); + node = pfile->cb.macro_to_expand (pfile, result); + if (node) + ret = enter_macro_context (pfile, node, result); + else if (whitespace_after) + { + /* If macro_to_expand hook returned NULL and it + ate some tokens, see if we don't need to add + a padding token in between this and the + next token. */ + peek_tok = cpp_peek_token (pfile, 0); + if (peek_tok->type != CPP_PADDING + && (peek_tok->flags & PREV_WHITE) == 0) + _cpp_push_token_context (pfile, NULL, + padding_token (pfile, + peek_tok), 1); + } + } + } + else + ret = enter_macro_context (pfile, node, result); + if (ret) { if (pfile->state.in_directive || ret == 2) continue; |