On April 11, 2017 10:54:10 PM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote: >Hi! > >This is another case where we miss needed folding from argN or their >arguments to the expected expression type (type has to be compatible >with opN's type, but argN is after STRIP_NOPS). > >Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Richard. >2017-04-11 Jakub Jelinek <ja...@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.C: New test. > >--- gcc/fold-const.c.jj 2017-04-10 22:27:00.000000000 +0200 >+++ gcc/fold-const.c 2017-04-11 20:07:02.459839450 +0200 >@@ -9916,12 +9916,12 @@ fold_binary_loc (location_t loc, > } > > if (c3 != c1) >- return fold_build2_loc (loc, BIT_IOR_EXPR, type, >- fold_build2_loc (loc, BIT_AND_EXPR, type, >- TREE_OPERAND (arg0, 0), >- wide_int_to_tree (type, >- c3)), >- arg1); >+ { >+ tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); >+ tem = fold_build2_loc (loc, BIT_AND_EXPR, type, tem, >+ wide_int_to_tree (type, c3)); >+ return fold_build2_loc (loc, BIT_IOR_EXPR, type, tem, arg1); >+ } > } > > /* See if this can be simplified into a rotate first. If that >--- gcc/testsuite/g++.dg/ubsan/pr80349.C.jj 2017-04-11 >20:29:10.154344673 +0200 >+++ gcc/testsuite/g++.dg/ubsan/pr80349.C 2017-04-11 20:28:38.000000000 >+0200 >@@ -0,0 +1,11 @@ >+// PR sanitizer/80349 >+// { dg-do compile } >+// { dg-options "-fsanitize=undefined" } >+ >+extern const long long int v; >+ >+void >+foo () >+{ >+ (int)((v & 50 | 051UL) << 0) << 0; >+} > > Jakub