From a37a7b8a0199e76227055ed537c54ddd022eb8a5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 30 Mar 2009 17:00:52 +0200 Subject: [PATCH] re PR target/39558 (Bad interaction of decls named 'vector' and -maltivec vector support) 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. From-SVN: r145297 --- gcc/testsuite/ChangeLog | 3 ++ gcc/testsuite/gcc.target/powerpc/altivec-29.c | 23 +++++++++++++ libcpp/ChangeLog | 6 ++++ libcpp/macro.c | 34 ++++++++++++++++--- 4 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/altivec-29.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d672724fbbd..cf19d16e87f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -2,6 +2,9 @@ * gfortran.dg/bind_c_usage_19.f90: New test. + PR target/39558 + * gcc.target/powerpc/altivec-29.c: New test. + 2009-03-30 Joseph Myers PR rtl-optimization/323 diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-29.c b/gcc/testsuite/gcc.target/powerpc/altivec-29.c new file mode 100644 index 00000000000..10a25ecbb1b --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/altivec-29.c @@ -0,0 +1,23 @@ +/* PR target/39558 */ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec -save-temps" } */ + +#define ATTRIBUTE_UNUSED __attribute__((unused)) + +int *foo (int *vector) +{ + return vector; +} + +int *bar (int *vector ATTRIBUTE_UNUSED) +{ + return vector; +} + +int *baz (int *vector __attribute__((unused))) +{ + return vector; +} + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index a9841c7314d..4bf58690b6f 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,9 @@ +2009-03-30 Jakub Jelinek + + PR target/39558 + * macro.c (cpp_get_token): If macro_to_expand returns NULL + and used some tokens, add CPP_PADDING before next token. + 2009-03-29 Joseph Myers PR preprocessor/34695 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;