mirror of git://gcc.gnu.org/git/gcc.git
PR tree-optimization/83239 - False positive from -Wstringop-overflow
PR tree-optimization/83239 - False positive from -Wstringop-overflow
on simple std::vector code
libstdc++/CHangeLog:
* include/bits/vector.tcc (vector::_M_default_append): Assert
invariant to generate better code.
gcc/testsuite/ChangeLog:
* g++.dg/pr83239.C: New test case.
From-SVN: r255753
This commit is contained in:
parent
1eaa31d840
commit
d43568222a
|
|
@ -1,3 +1,8 @@
|
||||||
|
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>
|
2017-12-16 Sebastian Peryt <sebastian.peryt@intel.com>
|
||||||
|
|
||||||
PR testsuite/82767
|
PR testsuite/82767
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
// 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 } }
|
||||||
|
|
@ -1,3 +1,9 @@
|
||||||
|
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>
|
2017-12-14 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
PR libstdc++/83279
|
PR libstdc++/83279
|
||||||
|
|
|
||||||
|
|
@ -582,8 +582,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
||||||
{
|
{
|
||||||
if (__n != 0)
|
if (__n != 0)
|
||||||
{
|
{
|
||||||
if (size_type(this->_M_impl._M_end_of_storage
|
size_type __size = size();
|
||||||
- this->_M_impl._M_finish) >= __n)
|
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);
|
_GLIBCXX_ASAN_ANNOTATE_GROW(__n);
|
||||||
this->_M_impl._M_finish =
|
this->_M_impl._M_finish =
|
||||||
|
|
@ -595,7 +601,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
||||||
{
|
{
|
||||||
const size_type __len =
|
const size_type __len =
|
||||||
_M_check_len(__n, "vector::_M_default_append");
|
_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_start(this->_M_allocate(__len));
|
||||||
pointer __new_finish(__new_start);
|
pointer __new_finish(__new_start);
|
||||||
__try
|
__try
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue