diff --git a/gcc/pointer-query.cc b/gcc/pointer-query.cc index 18b3cda4268..61b0032b2fb 100644 --- a/gcc/pointer-query.cc +++ b/gcc/pointer-query.cc @@ -74,7 +74,12 @@ get_offset_range (tree x, gimple *stmt, offset_int r[2], range_query *rvals) x = TREE_OPERAND (x, 0); tree type = TREE_TYPE (x); - if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type)) + if ((!INTEGRAL_TYPE_P (type) + /* ??? We get along without caring about overflow by using + offset_int, but that falls apart when indexes are bigger + than pointer differences. */ + || TYPE_PRECISION (type) > TYPE_PRECISION (ptrdiff_type_node)) + && !POINTER_TYPE_P (type)) return false; if (TREE_CODE (x) != INTEGER_CST diff --git a/gcc/testsuite/gcc.dg/torture/pr110043.c b/gcc/testsuite/gcc.dg/torture/pr110043.c new file mode 100644 index 00000000000..32c9ad77a79 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr110043.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target int128 } */ + +__int128 g_116_1; +extern char g_521[][8]; +void func_24() { + for (; g_116_1 >= 0;) + g_521[g_116_1][g_116_1] &= 0; +}