[PATCH] Enforce LWG DR 2566 requirement for container adaptors
Jonathan Wakely
jwakely@redhat.com
Thu Feb 14 14:10:00 GMT 2019
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.
Tested powerpc64le-linux, committed to trunk.
-------------- next part --------------
commit 69e8bd2a9cbae0b3e19abcd36615fc9e662db947
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Thu Feb 14 09:58:17 2019 +0000
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.
diff --git a/libstdc++-v3/doc/xml/manual/intro.xml b/libstdc++-v3/doc/xml/manual/intro.xml
index 71050a0cebc..2a3231f4eb4 100644
--- a/libstdc++-v3/doc/xml/manual/intro.xml
+++ b/libstdc++-v3/doc/xml/manual/intro.xml
@@ -1120,11 +1120,18 @@ requirements of the license of GCC.
ill-formed.
</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>:
<emphasis>There is no way to supply an allocator for <code>basic_string(str, pos)</code>
</emphasis>
</term>
- <listitem><para>Add new constructor
+ <listitem><para>Add new constructor.
</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>:
diff --git a/libstdc++-v3/include/bits/stl_queue.h b/libstdc++-v3/include/bits/stl_queue.h
index 6d092c9bbfe..1eb56810edc 100644
--- a/libstdc++-v3/include/bits/stl_queue.h
+++ b/libstdc++-v3/include/bits/stl_queue.h
@@ -118,7 +118,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _Alloc>
using _Uses = typename
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:
typedef typename _Sequence::value_type value_type;
@@ -451,17 +459,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _Alloc>
using _Uses = typename
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:
typedef typename _Sequence::value_type value_type;
- typedef typename _Sequence::reference reference;
- typedef typename _Sequence::const_reference const_reference;
- typedef typename _Sequence::size_type size_type;
- typedef _Sequence container_type;
+ typedef typename _Sequence::reference reference;
+ typedef typename _Sequence::const_reference const_reference;
+ typedef typename _Sequence::size_type size_type;
+ typedef _Sequence container_type;
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// DR 2684. priority_queue lacking comparator typedef
- typedef _Compare value_compare;
+ typedef _Compare value_compare;
protected:
// See queue::c for notes on these names.
diff --git a/libstdc++-v3/include/bits/stl_stack.h b/libstdc++-v3/include/bits/stl_stack.h
index e8443a78a05..28faab2e871 100644
--- a/libstdc++-v3/include/bits/stl_stack.h
+++ b/libstdc++-v3/include/bits/stl_stack.h
@@ -120,7 +120,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _Alloc>
using _Uses = typename
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:
typedef typename _Sequence::value_type value_type;
More information about the Gcc-patches
mailing list