On Tue, Apr 25, 2017 at 06:09:20PM +0200, Jakub Jelinek wrote: > On Tue, Apr 25, 2017 at 06:05:25PM +0200, Marek Polacek wrote: > > Here we are crashing because fold_binary_loc produced a BIT_IOR_EXPR with > > incompatible operands. Fixed by adding the missing conversion, similarly > > to <https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00551.html>. > > > > Bootstrapped/regtested on x86_64-linux, ok for trunk? And 7.1? > > > > 2017-04-25 Marek Polacek <pola...@redhat.com> > > > > PR sanitizer/80349 > > * fold-const.c (fold_binary_loc) <case BIT_IOR_EXPR>: Convert arg0's > > first argument to type. > > > > * g++.dg/ubsan/pr80349-2.C: New test. > > > > diff --git gcc/fold-const.c gcc/fold-const.c > > index f0b8e7a..ce4b2df 100644 > > --- gcc/fold-const.c > > +++ gcc/fold-const.c > > @@ -9898,8 +9898,10 @@ fold_binary_loc (location_t loc, > > > > /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2. */ > > if (msk.and_not (c1 | c2) == 0) > > - return fold_build2_loc (loc, BIT_IOR_EXPR, type, > > - TREE_OPERAND (arg0, 0), arg1); > > + { > > + tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); > > + return fold_build2_loc (loc, BIT_IOR_EXPR, type, tem, arg1); > > Shouldn't this use op1 instead of arg1, just in case op1 is a NOP_EXPR > of INTEGER_CST or similar unfolded tree?
I didn't think so, because other spots in <case BIT_IOR_EXPR> don't use that either, e.g. the if (c3 != c1). But surely I can change it to op1, just the place I'm touching or something else too? Marek