+2018-07-16 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/86537
+ * include/bits/shared_ptr.h (less<shared_ptr<_Tp>>): Remove
+ non-standard partial specialization.
+ * include/bits/shared_ptr_base.h (_Sp_less): Remove class definition.
+ (less<__shared_ptr<_Tp, _Lp>): Remove partial specialization.
+ * testsuite/20_util/shared_ptr/comparison/86537.cc: New test.
+
2018-07-16 Andreas Krebbel <krebbel@linux.ibm.com>
* config/abi/post/s390-linux-gnu/baseline_symbols.txt: Update.
operator>=(nullptr_t, const __shared_ptr<_Tp, _Lp>& __a) noexcept
{ return !(nullptr < __a); }
- template<typename _Sp>
- struct _Sp_less : public binary_function<_Sp, _Sp, bool>
- {
- bool
- operator()(const _Sp& __lhs, const _Sp& __rhs) const noexcept
- {
- typedef typename _Sp::element_type element_type;
- return std::less<element_type*>()(__lhs.get(), __rhs.get());
- }
- };
-
- template<typename _Tp, _Lock_policy _Lp>
- struct less<__shared_ptr<_Tp, _Lp>>
- : public _Sp_less<__shared_ptr<_Tp, _Lp>>
- { };
-
// 20.7.2.2.8 shared_ptr specialized algorithms.
template<typename _Tp, _Lock_policy _Lp>
inline void
--- /dev/null
+// Copyright (C) 2018 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 run { target c++11 } }
+
+#include <memory>
+#include <testsuite_hooks.h>
+
+struct Should_not_happen { };
+
+struct X { };
+
+namespace std {
+ template<> struct less<X*> {
+ bool operator()(X*, X*) const { throw Should_not_happen(); }
+ };
+}
+
+bool custom_op_called = false;
+
+bool
+operator<(const std::shared_ptr<X>&, const std::shared_ptr<X>&)
+{
+ custom_op_called = true;
+ return false;
+}
+
+void
+test01()
+{
+ const std::shared_ptr<X> sp;
+ bool b = sp < sp;
+ VERIFY( !b );
+ VERIFY( custom_op_called );
+
+ std::less<std::shared_ptr<X>> lt;
+ custom_op_called = false;
+ b = lt(sp, sp);
+ VERIFY( !b );
+ VERIFY( custom_op_called ); // PR libstdc++/86537 and LWG DR 1262
+
+#if __cplusplus >= 201402L
+ std::less<> ltv;
+ custom_op_called = false;
+ b = ltv(sp, sp);
+ VERIFY( !b );
+ VERIFY( custom_op_called );
+#endif
+}
+
+int
+main()
+{
+ test01();
+}