diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2019-02-14 14:10:12 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2019-02-14 14:10:12 +0000 |
commit | 1138a19dfe5029e6ead3bb26bb344bddce9f24f0 (patch) | |
tree | 1224e15bd9662936e0ecc5037eacc49dc8414fb8 | |
parent | affd7d477acb4a19dd588e51e6d5597679d0391d (diff) | |
download | gcc-1138a19dfe5029e6ead3bb26bb344bddce9f24f0.zip gcc-1138a19dfe5029e6ead3bb26bb344bddce9f24f0.tar.gz gcc-1138a19dfe5029e6ead3bb26bb344bddce9f24f0.tar.bz2 |
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
-rw-r--r-- | libstdc++-v3/ChangeLog | 5 | ||||
-rw-r--r-- | libstdc++-v3/doc/xml/manual/intro.xml | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_queue.h | 30 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_stack.h | 10 |
4 files changed, 45 insertions, 9 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c20c4e1..8cedc38 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,10 @@ 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 * testsuite/20_util/enable_shared_from_this/89303.cc: New test. diff --git a/libstdc++-v3/doc/xml/manual/intro.xml b/libstdc++-v3/doc/xml/manual/intro.xml index 71050a0..2a3231f 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 6d092c9..1eb5681 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 e8443a7..28faab2 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; |