diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-06-27 12:38:23 +0200 |
---|---|---|
committer | Giuliano Belinassi <giuliano.belinassi@usp.br> | 2020-08-17 13:15:08 -0300 |
commit | 21eba61de879b1e01804a3567bbb1e64750bdcee (patch) | |
tree | 1986ba0e20908ee9714922b2d88ace3be9434552 /gcc/fortran | |
parent | badd0f254d890ce04a8aa3b8d055e48c71ef2216 (diff) | |
download | gcc-21eba61de879b1e01804a3567bbb1e64750bdcee.zip gcc-21eba61de879b1e01804a3567bbb1e64750bdcee.tar.gz gcc-21eba61de879b1e01804a3567bbb1e64750bdcee.tar.bz2 |
c-family: Use TYPE_OVERFLOW_UNDEFINED instead of !TYPE_UNSIGNED in pointer_sum [PR95903]
For lp64 targets and int off ... ptr[off + 1]
is lowered in pointer_sum to *(ptr + ((sizetype) off + (sizetype) 1)).
That is fine when signed integer wrapping is undefined (and is not done
already if off has unsigned type), but changes behavior for -fwrapv, where
overflow is well defined. Runtime test could be:
int
main ()
{
char *p = __builtin_malloc (0x100000000UL);
if (!p) return 0;
char *q = p + 0x80000000UL;
int o = __INT_MAX__;
q[o + 1] = 1;
if (q[-__INT_MAX__ - 1] != 1) __builtin_abort ();
return 0;
}
with -fwrapv or so, not included in the testsuite because it requires 4GB
allocation (with some other test it would be enough to have something
slightly above 2GB, but still...).
2020-06-27 Jakub Jelinek <jakub@redhat.com>
PR middle-end/95903
gcc/c-family/
* c-common.c (pointer_int_sum): Use TYPE_OVERFLOW_UNDEFINED instead of
!TYPE_UNSIGNED check to see if we can apply distributive law and handle
smaller precision intop operands separately.
gcc/testsuite/
* c-c++-common/pr95903.c: New test.
Diffstat (limited to 'gcc/fortran')
0 files changed, 0 insertions, 0 deletions