diff options
author | Marek Polacek <polacek@redhat.com> | 2017-04-25 16:39:57 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2017-04-25 16:39:57 +0000 |
commit | 2ef42cf92408dadf44b5418b1c369bf0aa36d657 (patch) | |
tree | 0559664ecf5005057eead62d6c64c33d51e42534 /gcc/fold-const.c | |
parent | 70caf430fe8b94a213f60ef7798766990da1b311 (diff) | |
download | gcc-2ef42cf92408dadf44b5418b1c369bf0aa36d657.zip gcc-2ef42cf92408dadf44b5418b1c369bf0aa36d657.tar.gz gcc-2ef42cf92408dadf44b5418b1c369bf0aa36d657.tar.bz2 |
re PR sanitizer/80349 (UBSAN: compile time crash with "type mismatch in binary expression" message)
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.
From-SVN: r247257
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index f0b8e7a..ce4b2df 100644 --- a/gcc/fold-const.c +++ b/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); + } /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2, unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some |