Hi! The second argument of OMP_CRITICAL is IDENTIFIER_NODE, but we were ICEing on that with -Wduplicate-branches, because we didn't know how to hash it. operand_equal_p handles it the way it should, only pointer equal IDENTIFIER_NODEs are the same.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2018-06-03 Jakub Jelinek <ja...@redhat.com> PR c++/86025 * tree.c (inchash::add_expr): Handle IDENTIFIER_NODE. * c-c++-common/gomp/pr86025.c: New test. --- gcc/tree.c.jj 2018-05-25 14:34:36.869377392 +0200 +++ gcc/tree.c 2018-06-01 15:36:40.882938758 +0200 @@ -7360,6 +7360,9 @@ add_expr (const_tree t, inchash::hash &h for (i = 0; i < TREE_VEC_LENGTH (t); ++i) inchash::add_expr (TREE_VEC_ELT (t, i), hstate, flags); return; + case IDENTIFIER_NODE: + hstate.add_object (IDENTIFIER_HASH_VALUE (t)); + 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 --- gcc/testsuite/c-c++-common/gomp/pr86025.c.jj 2018-06-01 15:55:50.377382152 +0200 +++ gcc/testsuite/c-c++-common/gomp/pr86025.c 2018-06-01 15:55:32.632359904 +0200 @@ -0,0 +1,20 @@ +/* PR c++/86025 */ +/* { dg-do compile } */ +/* { dg-additional-options "-Wduplicated-branches" } */ + +int i; + +void +foo (int x) +{ + if (x) + { + #pragma omp critical (foo) + i++; + } + else + { + #pragma omp critical + i++; + } +} Jakub