[PATCH] -Wduplicated-branches -fopenmp ICE in inchash::add_expr (PR c++/79672)

Marek Polacek polacek@redhat.com
Wed Mar 1 19:09:00 GMT 2017


The following testcase ICEd with -Wduplicated-branches and -fopenmp
because we tried to has omp_parallel expression that contained some
TREE_VECs, but those aren't handled in inchash::add_expr.  Handling
that is easy and fixes the ICE.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2017-03-01  Marek Polacek  <polacek@redhat.com>

	PR c++/79672
	* tree.c (inchash::add_expr): Handle TREE_VEC.

	* g++.dg/warn/Wduplicated-branches2.C: Fix PR.
	* g++.dg/warn/Wduplicated-branches3.C: New test.

diff --git gcc/testsuite/g++.dg/warn/Wduplicated-branches2.C gcc/testsuite/g++.dg/warn/Wduplicated-branches2.C
index 4da2d54..7e14c5f 100644
--- gcc/testsuite/g++.dg/warn/Wduplicated-branches2.C
+++ gcc/testsuite/g++.dg/warn/Wduplicated-branches2.C
@@ -1,4 +1,4 @@
-// PR c/6427
+// PR c/64279
 // { dg-do compile { target c++11 } }
 // { dg-options "-Wduplicated-branches" }
 
diff --git gcc/testsuite/g++.dg/warn/Wduplicated-branches3.C gcc/testsuite/g++.dg/warn/Wduplicated-branches3.C
index e69de29..26dab85 100644
--- gcc/testsuite/g++.dg/warn/Wduplicated-branches3.C
+++ gcc/testsuite/g++.dg/warn/Wduplicated-branches3.C
@@ -0,0 +1,18 @@
+// PR c++/79672
+// { dg-do compile }
+// { dg-options "-Wduplicated-branches -fopenmp" }
+// { dg-require-effective-target fopenmp }
+
+template<int N> void foo()
+{
+  if (N > 0)
+  {
+#pragma omp parallel for
+    for (int i = 0; i < 10; ++i) ;
+  }
+}
+
+void bar()
+{
+  foo<0>();
+}
diff --git gcc/tree.c gcc/tree.c
index 42c8a2d..8f87e7c 100644
--- gcc/tree.c
+++ gcc/tree.c
@@ -7865,6 +7865,10 @@ add_expr (const_tree t, inchash::hash &hstate, unsigned int flags)
 	  inchash::add_expr (tsi_stmt (i), hstate, flags);
 	return;
       }
+    case TREE_VEC:
+      for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
+	inchash::add_expr (TREE_VEC_ELT (t, i), hstate, flags);
+      return;
     case FUNCTION_DECL:
       /* When referring to a built-in FUNCTION_DECL, use the __builtin__ form.
 	 Otherwise nodes that compare equal according to operand_equal_p might

	Marek



More information about the Gcc-patches mailing list