diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-03-21 09:10:30 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-03-21 09:10:30 +0100 |
commit | 9f30dff0eed2813ead7a2e2927e0eb8c333baf8b (patch) | |
tree | 25395a0bf3f57d3e2ac54445b270b159ac79d661 /gcc | |
parent | 9da12bea7dd6fe01bdb2fc559f22901e0e59b6ca (diff) | |
download | gcc-9f30dff0eed2813ead7a2e2927e0eb8c333baf8b.zip gcc-9f30dff0eed2813ead7a2e2927e0eb8c333baf8b.tar.gz gcc-9f30dff0eed2813ead7a2e2927e0eb8c333baf8b.tar.bz2 |
re PR middle-end/67338 (fold-const sanitizer runtime error in roundup_loc)
PR c/67338
* fold-const.c (round_up_loc): Negate divisor in unsigned type to
avoid UB.
* gcc.dg/pr67338.c: New test.
From-SVN: r246305
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr67338.c | 4 |
4 files changed, 14 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index afb4a52..59be61f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-03-21 Jakub Jelinek <jakub@redhat.com> + + PR c/67338 + * fold-const.c (round_up_loc): Negate divisor in unsigned type to + avoid UB. + 2017-03-20 Segher Boessenkool <segher@kernel.crashing.org> PR rtl-optimization/79910 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 12445aa..1a9a264 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -14250,7 +14250,7 @@ round_up_loc (location_t loc, tree value, unsigned int divisor) overflow_p = TREE_OVERFLOW (value); val += divisor - 1; - val &= - (int) divisor; + val &= (int) -divisor; if (val == 0) overflow_p = true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c2dc55a..69cf112 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2017-03-21 Jakub Jelinek <jakub@redhat.com> + PR c/67338 + * gcc.dg/pr67338.c: New test. + PR c++/35878 * g++.dg/init/pr35878_1.C: Rewrite directives to scan optimized dump instead of assembler. diff --git a/gcc/testsuite/gcc.dg/pr67338.c b/gcc/testsuite/gcc.dg/pr67338.c new file mode 100644 index 0000000..0fdc302 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr67338.c @@ -0,0 +1,4 @@ +/* PR c/67338 */ +/* { dg-do compile { target *-*-linux* *-*-gnu* } } */ + +struct S { __attribute__((aligned (1 << 28))) double a; }; |