This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] Fix -std=c++11 OpenMP UDR handling (PR c++/60331)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 18 Mar 2014 16:16:45 +0100
- Subject: [C++ PATCH] Fix -std=c++11 OpenMP UDR handling (PR c++/60331)
- Authentication-results: sourceware.org; auth=none
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
Apparently with -std=c++11 and higher, if in a template we call
finish_expr_stmt on a DECL_EXPR (as cp_parser_omp_declare_reduction_exprs
does) and the omp_priv var in there is not type dependent, it ICEs during:
else if (!type_dependent_expression_p (expr))
convert_to_void (build_non_dependent_expr (expr), ICV_STATEMENT,
tf_warning_or_error);
So, the patch in that case just does the rest of what finish_expr_stmt
performs.
Jason, do you have better ideas how to fix this?
The patch has been bootstrapped/regtested on x86_64-linux and i686-linux.
2014-03-18 Jakub Jelinek <jakub@redhat.com>
PR c++/60331
* parser.c (cp_parser_omp_declare_reduction_exprs): Avoid calling
finish_expr_stmt on DECL_EXPRs in templates.
* testsuite/libgomp.c++/udr-11.C: New test.
* testsuite/libgomp.c++/udr-12.C: New test.
* testsuite/libgomp.c++/udr-13.C: New test.
* testsuite/libgomp.c++/udr-14.C: New test.
* testsuite/libgomp.c++/udr-15.C: New test.
* testsuite/libgomp.c++/udr-16.C: New test.
* testsuite/libgomp.c++/udr-17.C: New test.
* testsuite/libgomp.c++/udr-18.C: New test.
* testsuite/libgomp.c++/udr-19.C: New test.
--- gcc/cp/parser.c.jj 2014-03-18 10:04:14.000000000 +0100
+++ gcc/cp/parser.c 2014-03-18 11:18:44.511571459 +0100
@@ -30698,7 +30698,22 @@ cp_parser_omp_declare_reduction_exprs (t
block = finish_omp_structured_block (block);
cp_walk_tree (&block, cp_remove_omp_priv_cleanup_stmt, omp_priv, NULL);
- finish_expr_stmt (block);
+ if (block
+ && TREE_CODE (block) == DECL_EXPR
+ && processing_template_decl)
+ {
+ if (check_for_bare_parameter_packs (block))
+ block = error_mark_node;
+ if (TREE_CODE (block) != CLEANUP_POINT_EXPR)
+ {
+ if (TREE_CODE (block) != EXPR_STMT)
+ block = build_stmt (input_location, EXPR_STMT, block);
+ block = maybe_cleanup_point_expr_void (block);
+ }
+ add_stmt (block);
+ }
+ else
+ finish_expr_stmt (block);
if (ctor)
add_decl_expr (omp_orig);
--- libgomp/testsuite/libgomp.c++/udr-11.C.jj 2014-03-18 11:47:43.326846415 +0100
+++ libgomp/testsuite/libgomp.c++/udr-11.C 2014-03-18 11:47:43.329846576 +0100
@@ -0,0 +1,4 @@
+// { dg-do run }
+// { dg-options "-fopenmp -std=c++11" }
+
+#include "udr-1.C"
--- libgomp/testsuite/libgomp.c++/udr-12.C.jj 2014-03-18 11:47:43.330846623 +0100
+++ libgomp/testsuite/libgomp.c++/udr-12.C 2014-03-18 11:47:43.331846666 +0100
@@ -0,0 +1,4 @@
+// { dg-do run }
+// { dg-options "-fopenmp -std=c++11" }
+
+#include "udr-2.C"
--- libgomp/testsuite/libgomp.c++/udr-13.C.jj 2014-03-18 11:47:43.332846707 +0100
+++ libgomp/testsuite/libgomp.c++/udr-13.C 2014-03-18 11:47:43.332846707 +0100
@@ -0,0 +1,4 @@
+// { dg-do run }
+// { dg-options "-fopenmp -std=c++11" }
+
+#include "udr-3.C"
--- libgomp/testsuite/libgomp.c++/udr-14.C.jj 2014-03-18 11:47:43.333846744 +0100
+++ libgomp/testsuite/libgomp.c++/udr-14.C 2014-03-18 11:47:43.334846777 +0100
@@ -0,0 +1,4 @@
+// { dg-do run }
+// { dg-options "-fopenmp -std=c++11" }
+
+#include "udr-4.C"
--- libgomp/testsuite/libgomp.c++/udr-15.C.jj 2014-03-18 11:47:43.334846777 +0100
+++ libgomp/testsuite/libgomp.c++/udr-15.C 2014-03-18 11:47:43.335846809 +0100
@@ -0,0 +1,4 @@
+// { dg-do run }
+// { dg-options "-fopenmp -std=c++11" }
+
+#include "udr-5.C"
--- libgomp/testsuite/libgomp.c++/udr-16.C.jj 2014-03-18 11:47:43.336846840 +0100
+++ libgomp/testsuite/libgomp.c++/udr-16.C 2014-03-18 11:47:43.336846840 +0100
@@ -0,0 +1,4 @@
+// { dg-do run }
+// { dg-options "-fopenmp -std=c++11" }
+
+#include "udr-6.C"
--- libgomp/testsuite/libgomp.c++/udr-17.C.jj 2014-03-18 11:47:43.337846867 +0100
+++ libgomp/testsuite/libgomp.c++/udr-17.C 2014-03-18 11:47:43.337846867 +0100
@@ -0,0 +1,4 @@
+// { dg-do run }
+// { dg-options "-fopenmp -std=c++11" }
+
+#include "udr-7.C"
--- libgomp/testsuite/libgomp.c++/udr-18.C.jj 2014-03-18 11:47:43.338846892 +0100
+++ libgomp/testsuite/libgomp.c++/udr-18.C 2014-03-18 11:47:43.338846892 +0100
@@ -0,0 +1,4 @@
+// { dg-do run }
+// { dg-options "-fopenmp -std=c++11" }
+
+#include "udr-8.C"
--- libgomp/testsuite/libgomp.c++/udr-19.C.jj 2014-03-18 11:47:43.339846916 +0100
+++ libgomp/testsuite/libgomp.c++/udr-19.C 2014-03-18 11:47:43.339846916 +0100
@@ -0,0 +1,4 @@
+// { dg-do run }
+// { dg-options "-fopenmp -std=c++11" }
+
+#include "udr-9.C"
Jakub