From 500ecf4abd0f29d0cb4555de105a3f4152b6c423 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Fri, 29 Apr 2016 12:32:45 +0000 Subject: [PATCH] re PR sanitizer/70342 (g++ -fsanitize=undefined never finishes compiling (>24h) in qtxmlpatterns test suite) PR sanitizer/70342 * fold-const.c (tree_single_nonzero_warnv_p): For TARGET_EXPR, use TARGET_EXPR_SLOT as a base. * g++.dg/ubsan/null-7.C: New test. Co-Authored-By: Jakub Jelinek From-SVN: r235637 --- gcc/ChangeLog | 7 +++++++ gcc/fold-const.c | 3 +++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ubsan/null-7.C | 24 ++++++++++++++++++++++++ 4 files changed, 39 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ubsan/null-7.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b98598fa394..a6b68045776 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-04-29 Marek Polacek + Jakub Jelinek + + PR sanitizer/70342 + * fold-const.c (tree_single_nonzero_warnv_p): For TARGET_EXPR, use + TARGET_EXPR_SLOT as a base. + 2016-04-29 Andrew Burgess * config/arc/arc.md (*loadqi_update): Replace use of 'rI' diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 69749a85231..4aa24125440 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -13534,6 +13534,9 @@ tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p) if (!DECL_P (base)) base = get_base_address (base); + if (base && TREE_CODE (base) == TARGET_EXPR) + base = TARGET_EXPR_SLOT (base); + if (!base) return false; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7dfa23db3c1..93e89d98fb7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-29 Marek Polacek + + PR sanitizer/70342 + * g++.dg/ubsan/null-7.C: New test. + 2016-04-29 Dominik Vogt PR/69089 diff --git a/gcc/testsuite/g++.dg/ubsan/null-7.C b/gcc/testsuite/g++.dg/ubsan/null-7.C new file mode 100644 index 00000000000..8284bc7ddfa --- /dev/null +++ b/gcc/testsuite/g++.dg/ubsan/null-7.C @@ -0,0 +1,24 @@ +// PR sanitizer/70342 +// { dg-do compile } +// { dg-options "-fsanitize=null" } + +class A {}; +class B { +public: + B(A); +}; +class C { +public: + C operator<<(B); +}; +class D { + D(const int &); + C m_blackList; +}; +D::D(const int &) { + m_blackList << A() << A() << A() << A() << A() << A() << A() << A() << A() + << A() << A() << A() << A() << A() << A() << A() << A() << A() + << A() << A() << A() << A() << A() << A() << A() << A() << A() + << A() << A() << A() << A() << A() << A() << A() << A() << A() + << A() << A() << A() << A() << A() << A() << A() << A() << A(); +}