Enforce LWG DR 2566 requirement for container adaptors
Although there is no good use for stack<int, deque<double>> or similar types with a mismatched value_type, it's possible somebody is doing that and getting away with it currently. This patch only enforces the new requirement for C++17 and later. During stage 1 we should consider enforcing it for C++11 and C++14. * doc/xml/manual/intro.xml: Document LWG 2566 status. * include/bits/stl_queue.h (queue, priority_queue): Add static assertions to enforce LWG 2566 requirement on value_type. * include/bits/stl_stack.h (stack): Likewise. From-SVN: r268877
This commit is contained in:
parent
affd7d477a
commit
1138a19dfe
|
@ -1,5 +1,10 @@
|
||||||
2019-02-14 Jonathan Wakely <jwakely@redhat.com>
|
2019-02-14 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
|
* doc/xml/manual/intro.xml: Document LWG 2566 status.
|
||||||
|
* include/bits/stl_queue.h (queue, priority_queue): Add static
|
||||||
|
assertions to enforce LWG 2566 requirement on value_type.
|
||||||
|
* include/bits/stl_stack.h (stack): Likewise.
|
||||||
|
|
||||||
PR middle-end/89303
|
PR middle-end/89303
|
||||||
* testsuite/20_util/enable_shared_from_this/89303.cc: New test.
|
* testsuite/20_util/enable_shared_from_this/89303.cc: New test.
|
||||||
|
|
||||||
|
|
|
@ -1120,11 +1120,18 @@ requirements of the license of GCC.
|
||||||
ill-formed.
|
ill-formed.
|
||||||
</para></listitem></varlistentry>
|
</para></listitem></varlistentry>
|
||||||
|
|
||||||
|
<varlistentry xml:id="manual.bugs.dr2537"><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="&DR;#2537">2537</link>:
|
||||||
|
<emphasis>Requirements on the first template parameter of container adaptors
|
||||||
|
</emphasis>
|
||||||
|
</term>
|
||||||
|
<listitem><para>Add static assertions to enforce the requirement.
|
||||||
|
</para></listitem></varlistentry>
|
||||||
|
|
||||||
<varlistentry xml:id="manual.bugs.dr2583"><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="&DR;#2583">2583</link>:
|
<varlistentry xml:id="manual.bugs.dr2583"><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="&DR;#2583">2583</link>:
|
||||||
<emphasis>There is no way to supply an allocator for <code>basic_string(str, pos)</code>
|
<emphasis>There is no way to supply an allocator for <code>basic_string(str, pos)</code>
|
||||||
</emphasis>
|
</emphasis>
|
||||||
</term>
|
</term>
|
||||||
<listitem><para>Add new constructor
|
<listitem><para>Add new constructor.
|
||||||
</para></listitem></varlistentry>
|
</para></listitem></varlistentry>
|
||||||
|
|
||||||
<varlistentry xml:id="manual.bugs.dr2684"><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="&DR;#2684">2684</link>:
|
<varlistentry xml:id="manual.bugs.dr2684"><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="&DR;#2684">2684</link>:
|
||||||
|
|
|
@ -118,7 +118,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
template<typename _Alloc>
|
template<typename _Alloc>
|
||||||
using _Uses = typename
|
using _Uses = typename
|
||||||
enable_if<uses_allocator<_Sequence, _Alloc>::value>::type;
|
enable_if<uses_allocator<_Sequence, _Alloc>::value>::type;
|
||||||
#endif
|
|
||||||
|
#if __cplusplus >= 201703L
|
||||||
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||||
|
// 2566. Requirements on the first template parameter of container
|
||||||
|
// adaptors
|
||||||
|
static_assert(is_same<_Tp, typename _Sequence::value_type>::value,
|
||||||
|
"value_type must be the same as the underlying container");
|
||||||
|
#endif // C++17
|
||||||
|
#endif // C++11
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef typename _Sequence::value_type value_type;
|
typedef typename _Sequence::value_type value_type;
|
||||||
|
@ -451,17 +459,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
template<typename _Alloc>
|
template<typename _Alloc>
|
||||||
using _Uses = typename
|
using _Uses = typename
|
||||||
enable_if<uses_allocator<_Sequence, _Alloc>::value>::type;
|
enable_if<uses_allocator<_Sequence, _Alloc>::value>::type;
|
||||||
#endif
|
|
||||||
|
#if __cplusplus >= 201703L
|
||||||
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||||
|
// 2566. Requirements on the first template parameter of container
|
||||||
|
// adaptors
|
||||||
|
static_assert(is_same<_Tp, typename _Sequence::value_type>::value,
|
||||||
|
"value_type must be the same as the underlying container");
|
||||||
|
#endif // C++17
|
||||||
|
#endif // C++11
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef typename _Sequence::value_type value_type;
|
typedef typename _Sequence::value_type value_type;
|
||||||
typedef typename _Sequence::reference reference;
|
typedef typename _Sequence::reference reference;
|
||||||
typedef typename _Sequence::const_reference const_reference;
|
typedef typename _Sequence::const_reference const_reference;
|
||||||
typedef typename _Sequence::size_type size_type;
|
typedef typename _Sequence::size_type size_type;
|
||||||
typedef _Sequence container_type;
|
typedef _Sequence container_type;
|
||||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||||
// DR 2684. priority_queue lacking comparator typedef
|
// DR 2684. priority_queue lacking comparator typedef
|
||||||
typedef _Compare value_compare;
|
typedef _Compare value_compare;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// See queue::c for notes on these names.
|
// See queue::c for notes on these names.
|
||||||
|
|
|
@ -120,7 +120,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
template<typename _Alloc>
|
template<typename _Alloc>
|
||||||
using _Uses = typename
|
using _Uses = typename
|
||||||
enable_if<uses_allocator<_Sequence, _Alloc>::value>::type;
|
enable_if<uses_allocator<_Sequence, _Alloc>::value>::type;
|
||||||
#endif
|
|
||||||
|
#if __cplusplus >= 201703L
|
||||||
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||||
|
// 2566. Requirements on the first template parameter of container
|
||||||
|
// adaptors
|
||||||
|
static_assert(is_same<_Tp, typename _Sequence::value_type>::value,
|
||||||
|
"value_type must be the same as the underlying container");
|
||||||
|
#endif // C++17
|
||||||
|
#endif // C++11
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef typename _Sequence::value_type value_type;
|
typedef typename _Sequence::value_type value_type;
|
||||||
|
|
Loading…
Reference in New Issue