On Thu, Jan 26, 2017 at 12:21 PM, Marek Polacek <pola...@redhat.com> wrote: > This testcase was breaking because we found ourselves in operand_equal_p > with a COND_EXPR whose operand 2 was null -- i.e., missing else branch, > which won't happen for ? : but can happen here via -Wduplicated-branches. > > Bootstrapped/regtested on x86_64-linux, ok for trunk?
I think NULL isn't really allowed, it has to be sth of void type instead. Richard. > 2017-01-26 Marek Polacek <pola...@redhat.com> > > PR c/79199 > * fold-const.c (operand_equal_p) [COND_EXPR]: Use OP_SAME_WITH_NULL > for the third operand. > > * c-c++-common/Wduplicated-branches-13.c: New test. > > diff --git gcc/fold-const.c gcc/fold-const.c > index 5576d59..a8bb8af 100644 > --- gcc/fold-const.c > +++ gcc/fold-const.c > @@ -3147,7 +3147,7 @@ operand_equal_p (const_tree arg0, const_tree arg1, > unsigned int flags) > TREE_OPERAND (arg1, 0), flags)); > > case COND_EXPR: > - if (! OP_SAME (1) || ! OP_SAME (2)) > + if (! OP_SAME (1) || ! OP_SAME_WITH_NULL (2)) > return 0; > flags &= ~OEP_ADDRESS_OF; > return OP_SAME (0); > diff --git gcc/testsuite/c-c++-common/Wduplicated-branches-13.c > gcc/testsuite/c-c++-common/Wduplicated-branches-13.c > index e69de29..7aa5b37 100644 > --- gcc/testsuite/c-c++-common/Wduplicated-branches-13.c > +++ gcc/testsuite/c-c++-common/Wduplicated-branches-13.c > @@ -0,0 +1,23 @@ > +/* PR c/79199 */ > +/* { dg-do compile } */ > +/* { dg-options "-Wduplicated-branches" } */ > + > +unsigned int a, b, c, d, e; > +void > +fn1 (void) > +{ > + if (0) /* { dg-warning "this condition has identical branches" } */ > + { > + if (d > 4294967293) > + (void) 5; > + c = d; > + b = e | a; > + } > + else > + { > + if (d > 4294967293) > + (void) 5; > + c = d; > + b = e | a; > + } > +} > > Marek