I'm not entirely up to speed with this code, but this one seemed sufficiently obvious: check INTEGRAL_TYPE_P before looking at a tree's min/max value. Otherwise, go with maxobjsize.
Bootstrapped/regtested on x86_64-linux, ok for trunk? 2017-12-18 Marek Polacek <pola...@redhat.com> PR middle-end/83463 * gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Check if TYPE is INTEGRAL_TYPE_P before accessing its min/max values. * gcc.dg/pr83463.c: New test. diff --git gcc/gimple-ssa-warn-restrict.c gcc/gimple-ssa-warn-restrict.c index 4d424735d2a..d1a376637a2 100644 --- gcc/gimple-ssa-warn-restrict.c +++ gcc/gimple-ssa-warn-restrict.c @@ -287,13 +287,15 @@ builtin_memref::builtin_memref (tree expr, tree size) else { gimple *stmt = SSA_NAME_DEF_STMT (offset); + tree type; if (is_gimple_assign (stmt) - && gimple_assign_rhs_code (stmt) == NOP_EXPR) + && gimple_assign_rhs_code (stmt) == NOP_EXPR + && (type = TREE_TYPE (gimple_assign_rhs1 (stmt))) + && INTEGRAL_TYPE_P (type)) { /* Use the bounds of the type of the NOP_EXPR operand even if it's signed. The result doesn't trigger warnings but makes their output more readable. */ - tree type = TREE_TYPE (gimple_assign_rhs1 (stmt)); offrange[0] = wi::to_offset (TYPE_MIN_VALUE (type)); offrange[1] = wi::to_offset (TYPE_MAX_VALUE (type)); } diff --git gcc/testsuite/gcc.dg/pr83463.c gcc/testsuite/gcc.dg/pr83463.c index e69de29bb2d..735ef3c6dc8 100644 --- gcc/testsuite/gcc.dg/pr83463.c +++ gcc/testsuite/gcc.dg/pr83463.c @@ -0,0 +1,17 @@ +/* PR middle-end/83463 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wrestrict" } */ + +int *a; +void *memcpy (); +void +m (void *p1) +{ + memcpy (0, p1, 0); +} + +void +p () +{ + m (p + (long) a); +} Marek