aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-02-05 16:32:01 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2014-02-05 16:32:01 +0100
commit54e19c00d9a901e0c55f812c2f7f98392976f5b2 (patch)
tree609fabd616e83e31318192bc6edcde137458c1ef
parentf0f91770c34553275669df72794f5d478ae5fe7c (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/parser.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/gomp/pr58703.c6
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" } */