aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-03-21 16:41:13 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-03-21 16:41:13 +0100
commit6b36694859ea9f0951f329d55b60ecc70dba0c8b (patch)
treeb4a1dbbe62d9345281c8b712d8fa6dc58b6d2963 /gcc
parentc600d691f3b8151c76612984215983d852c3d903 (diff)
downloadgcc-6b36694859ea9f0951f329d55b60ecc70dba0c8b.zip
gcc-6b36694859ea9f0951f329d55b60ecc70dba0c8b.tar.gz
gcc-6b36694859ea9f0951f329d55b60ecc70dba0c8b.tar.bz2
re PR target/70296 (Incorrect handling of vector X; if X is function-like macro)
PR target/70296 * include/cpplib.h (cpp_fun_like_macro_p): New prototype. * macro.c (cpp_fun_like_macro_p): New function. * config/rs6000/rs6000-c.c (rs6000_macro_to_expand): If IDENT is function-like macro, peek following token(s) if it is followed by CPP_OPEN_PAREN token with optional padding in between, and if not, don't treat it like a macro. * gcc.target/powerpc/altivec-36.c: New test. From-SVN: r234371
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/rs6000/rs6000-c.c16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/powerpc/altivec-36.c46
4 files changed, 74 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b45acc5..0bc45fd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2016-03-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/70296
+ * config/rs6000/rs6000-c.c (rs6000_macro_to_expand): If IDENT is
+ function-like macro, peek following token(s) if it is followed
+ by CPP_OPEN_PAREN token with optional padding in between, and
+ if not, don't treat it like a macro.
+
2016-03-21 Thomas Schwinge <thomas@codesourcery.com>
Alexander Monakov <amonakov@ispras.ru>
diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-c.c
index b6e42f6..ceb80b2 100644
--- a/gcc/config/rs6000/rs6000-c.c
+++ b/gcc/config/rs6000/rs6000-c.c
@@ -216,7 +216,21 @@ rs6000_macro_to_expand (cpp_reader *pfile, const cpp_token *tok)
else if (ident && (ident != C_CPP_HASHNODE (__vector_keyword)))
{
enum rid rid_code = (enum rid)(ident->rid_code);
- if (ident->type == NT_MACRO)
+ enum node_type itype = ident->type;
+ /* If there is a function-like macro, check if it is going to be
+ invoked with or without arguments. Without following ( treat
+ it like non-macro, otherwise the following cpp_get_token eats
+ what should be preserved. */
+ if (itype == NT_MACRO && cpp_fun_like_macro_p (ident))
+ {
+ int idx2 = idx;
+ do
+ tok = cpp_peek_token (pfile, idx2++);
+ while (tok->type == CPP_PADDING);
+ if (tok->type != CPP_OPEN_PAREN)
+ itype = NT_VOID;
+ }
+ if (itype == NT_MACRO)
{
do
(void) cpp_get_token (pfile);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7880292..77fbafc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-03-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/70296
+ * gcc.target/powerpc/altivec-36.c: New test.
+
2016-03-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/70310
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-36.c b/gcc/testsuite/gcc.target/powerpc/altivec-36.c
new file mode 100644
index 0000000..ce9e6a3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-36.c
@@ -0,0 +1,46 @@
+/* PR target/70296 */
+/* { dg-do compile } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec -std=gnu11" } */
+
+#define c(x) x
+#define f(x)
+#define i int
+#define k
+typedef int vector;
+typedef vector int V;
+vector int a;
+vector b;
+vector c(int) d;
+vector c(e);
+vector c;
+vector f(int) int g;
+vector f(int) h;
+vector i j;
+vector k int l;
+vector k m;
+#define int(x) x
+vector int n;
+vector int(int) o;
+vector int(r);
+#undef int
+
+void
+foo ()
+{
+ V *p;
+ p = &a;
+ p = &d;
+ p = &g;
+ p = &j;
+ p = &l;
+ p = &n;
+ p = &o;
+ int *q;
+ q = &b;
+ q = &e;
+ q = &c;
+ q = &h;
+ q = &m;
+ q = &r;
+}