PR c++/58703
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 5 Feb 2014 15:32:01 +0000 (15:32 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 5 Feb 2014 15:32:01 +0000 (15:32 +0000)
* parser.c (cp_parser_omp_declare_reduction): Save and free
declarator_obstack.

* c-c++-common/gomp/pr58703.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@207511 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/pr58703.c [new file with mode: 0644]

index 5214d9a..60651c5 100644 (file)
@@ -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
index 57001c6..392acf2 100644 (file)
@@ -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
index 31f27d8..00aca0a 100644 (file)
@@ -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 (file)
index 0000000..6a3a5f5
--- /dev/null
@@ -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" } */