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 <pola...@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