88 lines
2.8 KiB
Diff
88 lines
2.8 KiB
Diff
2009-03-27 Jakub Jelinek <jakub@redhat.com>
|
|
|
|
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.
|
|
|
|
--- libcpp/macro.c.jj 2008-10-23 13:22:48.000000000 +0200
|
|
+++ libcpp/macro.c 2009-03-27 18:47:43.000000000 +0100
|
|
@@ -1,7 +1,7 @@
|
|
/* Part of CPP library. (Macro and #define handling.)
|
|
Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1998,
|
|
- 1999, 2000, 2001, 2002, 2003, 2004, 2005,
|
|
- 2006, 2007, 2008 Free Software Foundation, Inc.
|
|
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
|
+ Free Software Foundation, Inc.
|
|
Written by Per Bothner, 1994.
|
|
Based on CCCP program by Paul Rubin, June 1986
|
|
Adapted to ANSI C, Richard Stallman, Jan 1987
|
|
@@ -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;
|
|
--- gcc/testsuite/gcc.target/powerpc/altivec-29.c.jj 2009-03-27 18:50:44.000000000 +0100
|
|
+++ gcc/testsuite/gcc.target/powerpc/altivec-29.c 2009-03-27 18:51:16.000000000 +0100
|
|
@@ -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 } } */
|