diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-03-23 09:55:53 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-03-23 09:55:53 +0100 |
commit | ee3a999fe7dfddb2531b045738ff2c0c40e6eb4c (patch) | |
tree | 2e79f430a07b923b744e3898689ee65e1e67c75d /gcc | |
parent | 631270a5cedfad8267a5e7b94901035212713b61 (diff) | |
download | gcc-ee3a999fe7dfddb2531b045738ff2c0c40e6eb4c.zip gcc-ee3a999fe7dfddb2531b045738ff2c0c40e6eb4c.tar.gz gcc-ee3a999fe7dfddb2531b045738ff2c0c40e6eb4c.tar.bz2 |
re PR sanitizer/85029 (-fsanitize=undefined internal compiler error: in maybe_optimize_ubsan_ptr_ifn, at sanopt.c:493)
PR sanitizer/85029
* sanopt.c (maybe_optimize_ubsan_ptr_ifn): If DECL_REGISTER (base),
just don't try to optimize it rather than assert it never happens.
* g++.dg/ubsan/pr85029.C: New test.
From-SVN: r258794
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/sanopt.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ubsan/pr85029.C | 15 |
4 files changed, 28 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c6cdf21..9b22865 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-03-23 Jakub Jelinek <jakub@redhat.com> + + PR sanitizer/85029 + * sanopt.c (maybe_optimize_ubsan_ptr_ifn): If DECL_REGISTER (base), + just don't try to optimize it rather than assert it never happens. + 2018-03-22 Kelvin Nilsen <kelvin@gcc.gnu.org> * config/rs6000/rs6000-builtin.def: Remove various BU_ALTIVEC_X diff --git a/gcc/sanopt.c b/gcc/sanopt.c index 116bc38..223c06a 100644 --- a/gcc/sanopt.c +++ b/gcc/sanopt.c @@ -488,9 +488,9 @@ maybe_optimize_ubsan_ptr_ifn (sanopt_ctx *ctx, gimple *stmt) &unsignedp, &reversep, &volatilep); if ((offset == NULL_TREE || TREE_CODE (offset) == INTEGER_CST) && DECL_P (base) + && !DECL_REGISTER (base) && pbitpos.is_constant (&bitpos)) { - gcc_assert (!DECL_REGISTER (base)); offset_int expr_offset; if (offset) expr_offset = wi::to_offset (offset) + bitpos / BITS_PER_UNIT; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 560e6d3..87c8970 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-23 Jakub Jelinek <jakub@redhat.com> + + PR sanitizer/85029 + * g++.dg/ubsan/pr85029.C: New test. + 2018-03-23 Alexandre Oliva <aoliva@redhat.com> PR c++/71251 @@ -15,7 +20,7 @@ * g++.old-deja/g++.robertl/eb58.C: Likewise. * g++.old-deja/g++.robertl/eb63.C: Likewise. -2018-03-22 Steven G. Kargl <kargl@gcc.gnu.org +2018-03-22 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/84922 * gfortran.dg/interface_42.f90: New test. diff --git a/gcc/testsuite/g++.dg/ubsan/pr85029.C b/gcc/testsuite/g++.dg/ubsan/pr85029.C new file mode 100644 index 0000000..07472af --- /dev/null +++ b/gcc/testsuite/g++.dg/ubsan/pr85029.C @@ -0,0 +1,15 @@ +// PR sanitizer/85029 +// { dg-do compile } +// { dg-skip-if "" { *-*-* } { "-flto -fno-fat-lto-objects" } } +// { dg-options "-fsanitize=undefined" } + +struct B { + virtual B bar (); + int e; +} register a; // { dg-error "register name not specified for 'a'" } + +int +foo (...) +{ + return foo (a); +} |