This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] -Wduplicated-branches -fopenmp ICE in inchash::add_expr (PR c++/79672)
- From: Marek Polacek <polacek at redhat dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 1 Mar 2017 20:09:05 +0100
- Subject: [PATCH] -Wduplicated-branches -fopenmp ICE in inchash::add_expr (PR c++/79672)
- Authentication-results: sourceware.org; auth=none
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