aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2017-04-25 16:39:57 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2017-04-25 16:39:57 +0000
commit2ef42cf92408dadf44b5418b1c369bf0aa36d657 (patch)
tree0559664ecf5005057eead62d6c64c33d51e42534 /gcc
parent70caf430fe8b94a213f60ef7798766990da1b311 (diff)
downloadgcc-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')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ubsan/pr80349-2.C11
4 files changed, 26 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 56da691..1d35b3c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-04-25 Marek Polacek <polacek@redhat.com>
+
+ PR sanitizer/80349
+ * fold-const.c (fold_binary_loc) <case BIT_IOR_EXPR>: Convert arg0's
+ first argument to type.
+
2017-04-25 Bill Seurer <seurer@linux.vnet.ibm.com>
PR target/80482
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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6b1feff..0b2e208 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-04-25 Marek Polacek <polacek@redhat.com>
+
+ PR sanitizer/80349
+ * g++.dg/ubsan/pr80349-2.C: New test.
+
2017-04-25 Volker Reichelt <v.reichelt@netcologne.de>
* g++.dg/cpp0x/enum34.C: New test.
diff --git a/gcc/testsuite/g++.dg/ubsan/pr80349-2.C b/gcc/testsuite/g++.dg/ubsan/pr80349-2.C
new file mode 100644
index 0000000..ca5ea4a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ubsan/pr80349-2.C
@@ -0,0 +1,11 @@
+// PR sanitizer/80349
+// { dg-do compile }
+// { dg-options "-fsanitize=undefined" }
+
+unsigned long int ll;
+
+int
+foo ()
+{
+ return (2036854775807 >> ll & char(207648476159223) | 502810590243120797UL) << 0;
+}