diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr109442.C b/gcc/testsuite/g++.dg/tree-ssa/pr109442.C index ec40c470c8dd..ea5800aa1340 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/pr109442.C +++ b/gcc/testsuite/g++.dg/tree-ssa/pr109442.C @@ -1,5 +1,5 @@ // { dg-do compile { target c++11 } } -// { dg-options "-O1 -fdump-tree-optimized" } +// { dg-options "-O2 -fdump-tree-optimized" } #include #define T int T vat1(std::vector v1) { diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index df48ba3377fa..3ece16b2facd 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -1114,7 +1114,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR size_type size() const _GLIBCXX_NOEXCEPT - { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); } + { + ptrdiff_t __dif = this->_M_impl._M_finish - this->_M_impl._M_start; + if (__dif < 0) + __builtin_unreachable (); + return size_type(__dif); + } /** Returns the size() of the largest possible %vector. */ _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR @@ -1201,8 +1206,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER size_type capacity() const _GLIBCXX_NOEXCEPT { - return size_type(this->_M_impl._M_end_of_storage - - this->_M_impl._M_start); + ptrdiff_t __dif = this->_M_impl._M_end_of_storage + - this->_M_impl._M_start; + if (__dif < 0) + __builtin_unreachable (); + return size_type(__dif); } /**