diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ccf7c9e44b95..cad666123deb 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2018-07-16 Jonathan Wakely + + PR libstdc++/86537 + * include/bits/shared_ptr.h (less>): 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 * config/abi/post/s390-linux-gnu/baseline_symbols.txt: Update. diff --git a/libstdc++-v3/include/bits/shared_ptr.h b/libstdc++-v3/include/bits/shared_ptr.h index 2a54145083d5..2a82f1863284 100644 --- a/libstdc++-v3/include/bits/shared_ptr.h +++ b/libstdc++-v3/include/bits/shared_ptr.h @@ -480,10 +480,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator>=(nullptr_t, const shared_ptr<_Tp>& __a) noexcept { return !(nullptr < __a); } - template - struct less> : public _Sp_less> - { }; - // 20.7.2.2.8 shared_ptr specialized algorithms. template inline void diff --git a/libstdc++-v3/include/bits/shared_ptr_base.h b/libstdc++-v3/include/bits/shared_ptr_base.h index 887edbd78791..f3994da158f6 100644 --- a/libstdc++-v3/include/bits/shared_ptr_base.h +++ b/libstdc++-v3/include/bits/shared_ptr_base.h @@ -1502,22 +1502,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator>=(nullptr_t, const __shared_ptr<_Tp, _Lp>& __a) noexcept { return !(nullptr < __a); } - template - 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()(__lhs.get(), __rhs.get()); - } - }; - - template - struct less<__shared_ptr<_Tp, _Lp>> - : public _Sp_less<__shared_ptr<_Tp, _Lp>> - { }; - // 20.7.2.2.8 shared_ptr specialized algorithms. template inline void diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/comparison/86537.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/comparison/86537.cc new file mode 100644 index 000000000000..c8440a38ad0f --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/shared_ptr/comparison/86537.cc @@ -0,0 +1,69 @@ +// 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 +// . + +// { dg-do run { target c++11 } } + +#include +#include + +struct Should_not_happen { }; + +struct X { }; + +namespace std { + template<> struct less { + bool operator()(X*, X*) const { throw Should_not_happen(); } + }; +} + +bool custom_op_called = false; + +bool +operator<(const std::shared_ptr&, const std::shared_ptr&) +{ + custom_op_called = true; + return false; +} + +void +test01() +{ + const std::shared_ptr sp; + bool b = sp < sp; + VERIFY( !b ); + VERIFY( custom_op_called ); + + std::less> 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(); +}