diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-02-05 16:32:01 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-02-05 16:32:01 +0100 |
commit | 54e19c00d9a901e0c55f812c2f7f98392976f5b2 (patch) | |
tree | 609fabd616e83e31318192bc6edcde137458c1ef | |
parent | f0f91770c34553275669df72794f5d478ae5fe7c (diff) | |
download | gcc-54e19c00d9a901e0c55f812c2f7f98392976f5b2.zip gcc-54e19c00d9a901e0c55f812c2f7f98392976f5b2.tar.gz gcc-54e19c00d9a901e0c55f812c2f7f98392976f5b2.tar.bz2 |
re PR c++/58703 (ICE with invalid types in OpenMP declare reduction clause)
PR c++/58703
* parser.c (cp_parser_omp_declare_reduction): Save and free
declarator_obstack.
* c-c++-common/gomp/pr58703.c: New test.
From-SVN: r207511
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/pr58703.c | 6 |
4 files changed, 26 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5214d9a..60651c5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-02-05 Jakub Jelinek <jakub@redhat.com> + + PR c++/58703 + * parser.c (cp_parser_omp_declare_reduction): Save and free + declarator_obstack. + 2014-02-03 Marc Glisse <marc.glisse@inria.fr> PR c++/53017 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 57001c6..392acf2 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -30623,6 +30623,10 @@ cp_parser_omp_declare_reduction (cp_parser *parser, cp_token *pragma_tok, cp_token *first_token; cp_token_cache *cp; int errs; + void *p; + + /* Get the high-water mark for the DECLARATOR_OBSTACK. */ + p = obstack_alloc (&declarator_obstack, 0); if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN)) goto fail; @@ -30731,7 +30735,7 @@ cp_parser_omp_declare_reduction (cp_parser *parser, cp_token *pragma_tok, { fail: cp_parser_skip_to_pragma_eol (parser, pragma_tok); - return; + goto done; } first_token = cp_lexer_peek_token (parser->lexer); @@ -30835,6 +30839,10 @@ cp_parser_omp_declare_reduction (cp_parser *parser, cp_token *pragma_tok, } cp_parser_require_pragma_eol (parser, pragma_tok); + + done: + /* Free any declarators allocated. */ + obstack_free (&declarator_obstack, p); } /* OpenMP 4.0 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 31f27d8..00aca0a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-02-05 Jakub Jelinek <jakub@redhat.com> + + PR c++/58703 + * c-c++-common/gomp/pr58703.c: New test. + 2014-02-05 Richard Biener <rguenther@suse.de> PR testsuite/60076 diff --git a/gcc/testsuite/c-c++-common/gomp/pr58703.c b/gcc/testsuite/c-c++-common/gomp/pr58703.c new file mode 100644 index 0000000..6a3a5f5 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr58703.c @@ -0,0 +1,6 @@ +/* PR c++/58703 */ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +#pragma omp declare reduction (+ : char[] : omp_out += omp_in) /* { dg-error "function or array type" } */ +#pragma omp declare reduction (+ : char() : omp_out += omp_in) /* { dg-error "function or array type" } */ |