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 <[email protected]>
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