2016-10-05 Jakub Jelinek <jakub@redhat.com>
+ PR sanitizer/77823
+ * c-ubsan.c (ubsan_instrument_shift): Return NULL_TREE if type0
+ is not integral.
+
* c-common.c (c_common_reswords): Update comment for C++11.
2016-10-04 Jason Merrill <jason@redhat.com>
tree t, tt = NULL_TREE;
tree type0 = TREE_TYPE (op0);
tree type1 = TREE_TYPE (op1);
+ if (!INTEGRAL_TYPE_P (type0))
+ return NULL_TREE;
+
tree op1_utype = unsigned_type_for (type1);
HOST_WIDE_INT op0_prec = TYPE_PRECISION (type0);
tree uprecm1 = build_int_cst (op1_utype, op0_prec - 1);
/* If this is not a signed operation, don't perform overflow checks.
Also punt on bit-fields. */
- if (!INTEGRAL_TYPE_P (type0)
- || TYPE_OVERFLOW_WRAPS (type0)
+ if (TYPE_OVERFLOW_WRAPS (type0)
|| GET_MODE_BITSIZE (TYPE_MODE (type0)) != TYPE_PRECISION (type0))
;
+2016-10-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR sanitizer/77823
+ * c-c++-common/ubsan/shift-9.c: New test.
+
2016-10-05 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
* gcc.dg/torture/pr69941.c: Use __INT32_TYPE__ instead
--- /dev/null
+/* PR sanitizer/77823 */
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-fsanitize=undefined -Wno-psabi -w" } */
+
+typedef unsigned V __attribute__((vector_size(32)));
+typedef unsigned __int128 W __attribute__((vector_size(32)));
+
+V
+foo (V v)
+{
+ return v << 30;
+}
+
+V
+bar (V v, V w)
+{
+ return v << w;
+}
+
+W
+baz (W v)
+{
+ return v << 30;
+}
+
+W
+boo (W v, W w)
+{
+ return v << w;
+}