aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-11-28 08:49:08 +0000
committerJakub Jelinek <jakub@redhat.com>2018-11-28 08:49:08 +0000
commit5ddd99c15bb17036c2ffb6b75abeeff495c066a0 (patch)
treee4a15dbcfd4276091ffc6f69327bebcb0dc72031
parent395ff14395f404919d7eeebd5941e29ae7af35de (diff)
PR c++/88215
* c-ubsan.c: Include langhooks.h. (ubsan_instrument_division): Change gcc_assert that main variants of op0 and op1 types are equal to gcc_checking_assert that the main variants are compatible types. * c-c++-common/ubsan/pr88215.c: New test. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@266546 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/c-family/ChangeLog8
-rw-r--r--gcc/c-family/c-ubsan.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/ubsan/pr88215.c11
4 files changed, 28 insertions, 2 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index d99396719fb..bc85a93447b 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,11 @@
+2018-11-28 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/88215
+ * c-ubsan.c: Include langhooks.h.
+ (ubsan_instrument_division): Change gcc_assert that main variants
+ of op0 and op1 types are equal to gcc_checking_assert that the
+ main variants are compatible types.
+
2018-11-27 Eric Botcazou <ebotcazou@adacore.com>
* c-ada-spec.c: Include stringpool.h.
diff --git a/gcc/c-family/c-ubsan.c b/gcc/c-family/c-ubsan.c
index 4ef2bd80cfe..7b8a7ebec88 100644
--- a/gcc/c-family/c-ubsan.c
+++ b/gcc/c-family/c-ubsan.c
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see
#include "stringpool.h"
#include "attribs.h"
#include "asan.h"
+#include "langhooks.h"
/* Instrument division by zero and INT_MIN / -1. If not instrumenting,
return NULL_TREE. */
@@ -44,8 +45,9 @@ ubsan_instrument_division (location_t loc, tree op0, tree op1)
/* At this point both operands should have the same type,
because they are already converted to RESULT_TYPE.
Use TYPE_MAIN_VARIANT since typedefs can confuse us. */
- gcc_assert (TYPE_MAIN_VARIANT (TREE_TYPE (op0))
- == TYPE_MAIN_VARIANT (TREE_TYPE (op1)));
+ tree top0 = TYPE_MAIN_VARIANT (type);
+ tree top1 = TYPE_MAIN_VARIANT (TREE_TYPE (op1));
+ gcc_checking_assert (lang_hooks.types_compatible_p (top0, top1));
op0 = unshare_expr (op0);
op1 = unshare_expr (op1);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 920885b6aa7..411a3c8c778 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-11-28 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/88215
+ * c-c++-common/ubsan/pr88215.c: New test.
+
2018-10-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/88182
diff --git a/gcc/testsuite/c-c++-common/ubsan/pr88215.c b/gcc/testsuite/c-c++-common/ubsan/pr88215.c
new file mode 100644
index 00000000000..5db1664684d
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/ubsan/pr88215.c
@@ -0,0 +1,11 @@
+/* PR c++/88215 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=integer-divide-by-zero" } */
+
+int
+foo (void)
+{
+ int a = 2, __attribute__ ((__unused__)) b = 1;
+ int f = a / b;
+ return f;
+}