diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-03-21 16:41:13 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-03-21 16:41:13 +0100 |
commit | 6b36694859ea9f0951f329d55b60ecc70dba0c8b (patch) | |
tree | b4a1dbbe62d9345281c8b712d8fa6dc58b6d2963 /gcc | |
parent | c600d691f3b8151c76612984215983d852c3d903 (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000-c.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/altivec-36.c | 46 |
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; +} |