+2017-12-16 Martin Sebor <msebor@redhat.com>
+
+ PR tree-optimization/83239
+ * g++.dg/pr83239.C: New test case.
+
2017-12-16 Sebastian Peryt <sebastian.peryt@intel.com>
PR testsuite/82767
--- /dev/null
+// PR tree-optimization/83239 - False positive from -Wstringop-overflow
+// on simple std::vector code
+// { dg-do compile }
+// { dg-options "-O3 -Wall -fdump-tree-optimized" }
+
+#include <vector>
+
+// Verify no warnings are issued.
+
+template <class T>
+void test_loop ()
+{
+ std::vector<T> a;
+
+ int num = 2;
+
+ while (num > 0)
+ {
+ const typename std::vector<T>::size_type sz = a.size ();
+
+ if (sz < 3)
+ a.assign (1, 0);
+ else
+ a.resize (sz - 2);
+
+ --num;
+ }
+}
+
+// Verify no warnings are issued here either.
+
+template <class T>
+void test_if (std::vector<T> &a, int num)
+{
+ if (num > 0)
+ {
+ const typename std::vector<T>::size_type sz = a.size ();
+
+ if (sz < 3)
+ a.assign (1, 0);
+ else
+ a.resize (sz - 2);
+ }
+}
+
+// Instantiate each function on a different type to force both
+// to be fully inlined. Instantiating both on the same type
+// causes the inlining heuristics to outline _M_default_append
+// which, in turn, masks the warning.
+template void test_loop<int>();
+template void test_if<long>(std::vector<long>&, int);
+
+// Verify that std::vector<T>::_M_default_append() has been inlined
+// (the absence of warnings depends on it).
+// { dg-final { scan-tree-dump-not "_ZNSt6vectorIiSaIiEE17_M_default_appendEm" optimized } }
+// { dg-final { scan-tree-dump-not "_ZNSt6vectorIPvSaIS0_EE17_M_default_appendEm" optimized } }
+2017-12-16 Martin Sebor <msebor@redhat.com>
+
+ PR tree-optimization/83239
+ * include/bits/vector.tcc (vector::_M_default_append): Assert
+ invariant to generate better code.
+
2017-12-14 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/83279
{
if (__n != 0)
{
- if (size_type(this->_M_impl._M_end_of_storage
- - this->_M_impl._M_finish) >= __n)
+ size_type __size = size();
+ size_type __navail = size_type(this->_M_impl._M_end_of_storage
+ - this->_M_impl._M_finish);
+
+ if (__size > max_size() || __navail > max_size() - __size)
+ __builtin_unreachable();
+
+ if (__navail >= __n)
{
_GLIBCXX_ASAN_ANNOTATE_GROW(__n);
this->_M_impl._M_finish =
{
const size_type __len =
_M_check_len(__n, "vector::_M_default_append");
- const size_type __old_size = this->size();
+ const size_type __old_size = __size;
pointer __new_start(this->_M_allocate(__len));
pointer __new_finish(__new_start);
__try