PR libstdc++/92267 fix ABI change in deque iterators

Defaulting the copy constructor on its first declaration made it change
from user-provided (and non-trivial) to implicitly-defined (and
trivial). This caused an ABI incompatibility between GCC 8 and GCC 9,
where functions taking a deque iterator disagree on the argument passing
convention.

	PR libstdc++/92267
	* include/bits/stl_deque.h (_Deque_iterator(const _Deque_iterator&)):
	Do not define as defaulted.
	* testsuite/23_containers/deque/types/92267.cc: New test.

From-SVN: r277577
This commit is contained in:
Jonathan Wakely 2019-10-29 17:14:55 +00:00 committed by Jonathan Wakely
parent 668ca0509c
commit 0ed4d40833
3 changed files with 40 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2019-10-29 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/92267
* include/bits/stl_deque.h (_Deque_iterator(const _Deque_iterator&)):
Do not define as defaulted.
* testsuite/23_containers/deque/types/92267.cc: New test.
2019-10-26 Gerald Pfeifer <gerald@pfeifer.com> 2019-10-26 Gerald Pfeifer <gerald@pfeifer.com>
* doc/xml/manual/codecvt.xml: Switch pubs.opengroup.org to https. * doc/xml/manual/codecvt.xml: Switch pubs.opengroup.org to https.

View File

@ -156,13 +156,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
#else #else
// Conversion from iterator to const_iterator. // Conversion from iterator to const_iterator.
template<typename _Iter, template<typename _Iter,
typename = _Require<is_same<_Self, const_iterator>, typename = _Require<is_same<_Self, const_iterator>,
is_same<_Iter, iterator>>> is_same<_Iter, iterator>>>
_Deque_iterator(const _Iter& __x) noexcept _Deque_iterator(const _Iter& __x) noexcept
: _M_cur(__x._M_cur), _M_first(__x._M_first), : _M_cur(__x._M_cur), _M_first(__x._M_first),
_M_last(__x._M_last), _M_node(__x._M_node) { } _M_last(__x._M_last), _M_node(__x._M_node) { }
_Deque_iterator(const _Deque_iterator&) = default; _Deque_iterator(const _Deque_iterator& __x) noexcept
: _M_cur(__x._M_cur), _M_first(__x._M_first),
_M_last(__x._M_last), _M_node(__x._M_node) { }
_Deque_iterator& operator=(const _Deque_iterator&) = default; _Deque_iterator& operator=(const _Deque_iterator&) = default;
#endif #endif

View File

@ -0,0 +1,27 @@
// Copyright (C) 2019 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
// { dg-do compile { target c++11 } }
#include <deque>
using std::deque;
using std::is_trivially_copy_constructible;
// PR libstdc++/92267
static_assert(!is_trivially_copy_constructible<deque<int>::iterator>::value);
static_assert(!is_trivially_copy_constructible<deque<int>::const_iterator>::value);