diff mbox

[C++] Fix -std=c++11 OpenMP UDR handling (PR c++/60331)

Message ID 20140318151645.GY22862@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek March 18, 2014, 3:16 p.m. UTC
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.


	Jakub

Comments

Jason Merrill March 24, 2014, 6:02 p.m. UTC | #1
On 03/18/2014 11:16 AM, Jakub Jelinek wrote:
> Jason, do you have better ideas how to fix this?

Better would be to return false from potential_constant_expression_1 for 
DECL_EXPR; just add another case to the various _STMT tree codes.

Jason
diff mbox

Patch

--- 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"