2016-07-10 19:44:21 +02:00
|
|
|
// { dg-options "-std=gnu++17" }
|
|
|
|
// { dg-do run }
|
|
|
|
|
2017-01-01 13:07:43 +01:00
|
|
|
// Copyright (C) 2013-2017 Free Software Foundation, Inc.
|
2016-07-10 19:44:21 +02:00
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
|
2016-11-15 15:33:41 +01:00
|
|
|
// You should have received a copy of the GNU General Public License along
|
2016-07-10 19:44:21 +02:00
|
|
|
// with this library; see the file COPYING3. If not see
|
|
|
|
// <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
#include <optional>
|
|
|
|
#include <testsuite_hooks.h>
|
|
|
|
|
|
|
|
#include <tuple>
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
namespace ns
|
|
|
|
{
|
|
|
|
struct value_type
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
std::string s;
|
|
|
|
};
|
|
|
|
|
|
|
|
bool
|
|
|
|
operator==(value_type const& lhs, value_type const& rhs)
|
|
|
|
{ return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); }
|
|
|
|
|
Implement P0307R2, Making Optional Greater Equal Again.
* include/experimental/optional (_Has_addressof): Fix the comment.
* include/std/optional (_Has_addressof): Likewise.
(operator=(_Up&&)): Constrain.
(operator=(const optional<_Up>&)): Likewise.
(operator=(optional<_Up>&&)): Likewise.
(__optional_relop_t): New.
(operator==(const optional<_Tp>&, const optional<_Tp>&)): Constrain.
(operator!=(const optional<_Tp>&, const optional<_Tp>&)):
Constrain and make transparent.
(operator<(const optional<_Tp>&, const optional<_Tp>&)): Constrain.
(operator>(const optional<_Tp>&, const optional<_Tp>&)):
Constrain and make transparent.
(operator<=(const optional<_Tp>&, const optional<_Tp>&)): Likewise.
(operator>=(const optional<_Tp>&, const optional<_Tp>&)): Likewise.
(operator==(const optional<_Tp>&, const _Tp&): Constrain.
(operator==(const _Tp&, const optional<_Tp>&)): Likewise.
(operator!=(const optional<_Tp>&, _Tp const&)):
Constrain and make transparent.
(operator!=(const _Tp&, const optional<_Tp>&)): Likewise.
(operator<(const optional<_Tp>&, const _Tp&)): Constrain.
(operator<(const _Tp&, const optional<_Tp>&)): Likewise.
(operator>(const optional<_Tp>&, const _Tp&)):
Constrain and make transparent.
(operator>(const _Tp&, const optional<_Tp>&)): Likewise.
(operator<=(const optional<_Tp>&, const _Tp&)): Likewise.
(operator<=(const _Tp&, const optional<_Tp>&)): Likewise.
(operator>=(const optional<_Tp>&, const _Tp&)): Likewise.
(operator>=(const _Tp&, const optional<_Tp>&)): Likewise.
* testsuite/20_util/optional/constexpr/relops/2.cc: Adjust.
* testsuite/20_util/optional/constexpr/relops/4.cc: Likewise.
* testsuite/20_util/optional/relops/1.cc: Likewise.
* testsuite/20_util/optional/relops/2.cc: Likewise.
* testsuite/20_util/optional/relops/3.cc: Likewise.
* testsuite/20_util/optional/relops/4.cc: Likewise.
* testsuite/20_util/optional/requirements.cc: Add tests to verify
that optional's relops are transparent and don't synthesize
operators. Also test that assignment sfinaes.
From-SVN: r238292
2016-07-13 13:25:51 +02:00
|
|
|
bool
|
|
|
|
operator!=(value_type const& lhs, value_type const& rhs)
|
|
|
|
{ return std::tie(lhs.i, lhs.s) != std::tie(rhs.i, rhs.s); }
|
|
|
|
|
2016-07-10 19:44:21 +02:00
|
|
|
bool
|
|
|
|
operator<(value_type const& lhs, value_type const& rhs)
|
|
|
|
{ return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); }
|
Implement P0307R2, Making Optional Greater Equal Again.
* include/experimental/optional (_Has_addressof): Fix the comment.
* include/std/optional (_Has_addressof): Likewise.
(operator=(_Up&&)): Constrain.
(operator=(const optional<_Up>&)): Likewise.
(operator=(optional<_Up>&&)): Likewise.
(__optional_relop_t): New.
(operator==(const optional<_Tp>&, const optional<_Tp>&)): Constrain.
(operator!=(const optional<_Tp>&, const optional<_Tp>&)):
Constrain and make transparent.
(operator<(const optional<_Tp>&, const optional<_Tp>&)): Constrain.
(operator>(const optional<_Tp>&, const optional<_Tp>&)):
Constrain and make transparent.
(operator<=(const optional<_Tp>&, const optional<_Tp>&)): Likewise.
(operator>=(const optional<_Tp>&, const optional<_Tp>&)): Likewise.
(operator==(const optional<_Tp>&, const _Tp&): Constrain.
(operator==(const _Tp&, const optional<_Tp>&)): Likewise.
(operator!=(const optional<_Tp>&, _Tp const&)):
Constrain and make transparent.
(operator!=(const _Tp&, const optional<_Tp>&)): Likewise.
(operator<(const optional<_Tp>&, const _Tp&)): Constrain.
(operator<(const _Tp&, const optional<_Tp>&)): Likewise.
(operator>(const optional<_Tp>&, const _Tp&)):
Constrain and make transparent.
(operator>(const _Tp&, const optional<_Tp>&)): Likewise.
(operator<=(const optional<_Tp>&, const _Tp&)): Likewise.
(operator<=(const _Tp&, const optional<_Tp>&)): Likewise.
(operator>=(const optional<_Tp>&, const _Tp&)): Likewise.
(operator>=(const _Tp&, const optional<_Tp>&)): Likewise.
* testsuite/20_util/optional/constexpr/relops/2.cc: Adjust.
* testsuite/20_util/optional/constexpr/relops/4.cc: Likewise.
* testsuite/20_util/optional/relops/1.cc: Likewise.
* testsuite/20_util/optional/relops/2.cc: Likewise.
* testsuite/20_util/optional/relops/3.cc: Likewise.
* testsuite/20_util/optional/relops/4.cc: Likewise.
* testsuite/20_util/optional/requirements.cc: Add tests to verify
that optional's relops are transparent and don't synthesize
operators. Also test that assignment sfinaes.
From-SVN: r238292
2016-07-13 13:25:51 +02:00
|
|
|
|
|
|
|
bool
|
|
|
|
operator>(value_type const& lhs, value_type const& rhs)
|
|
|
|
{ return std::tie(lhs.i, lhs.s) > std::tie(rhs.i, rhs.s); }
|
|
|
|
|
|
|
|
bool
|
|
|
|
operator<=(value_type const& lhs, value_type const& rhs)
|
|
|
|
{ return std::tie(lhs.i, lhs.s) <= std::tie(rhs.i, rhs.s); }
|
|
|
|
|
|
|
|
bool
|
|
|
|
operator>=(value_type const& lhs, value_type const& rhs)
|
|
|
|
{ return std::tie(lhs.i, lhs.s) >= std::tie(rhs.i, rhs.s); }
|
2016-07-10 19:44:21 +02:00
|
|
|
|
|
|
|
} // namespace ns
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
using ns::value_type;
|
|
|
|
using O = std::optional<value_type>;
|
|
|
|
|
|
|
|
value_type const reference { 42, "forty-two" };
|
|
|
|
|
|
|
|
{
|
|
|
|
O o;
|
|
|
|
VERIFY( o < reference );
|
|
|
|
VERIFY( !(reference < o) );
|
|
|
|
VERIFY( !(o > reference) );
|
|
|
|
VERIFY( reference > o );
|
|
|
|
VERIFY( o <= reference );
|
|
|
|
VERIFY( !(reference <= o) );
|
|
|
|
VERIFY( !(o >= reference) );
|
|
|
|
VERIFY( reference >= o );
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
O o { value_type { 11, "eleventy" } };
|
|
|
|
VERIFY( o < reference );
|
|
|
|
VERIFY( !(reference < o) );
|
|
|
|
VERIFY( !(o > reference) );
|
|
|
|
VERIFY( reference > o );
|
|
|
|
VERIFY( o <= reference );
|
|
|
|
VERIFY( !(reference <= o) );
|
|
|
|
VERIFY( !(o >= reference) );
|
|
|
|
VERIFY( reference >= o );
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
O o { value_type { 42, "forty-two" } };
|
|
|
|
VERIFY( !(o < reference) );
|
|
|
|
VERIFY( !(reference < o) );
|
|
|
|
VERIFY( !(o > reference) );
|
|
|
|
VERIFY( !(reference > o) );
|
|
|
|
VERIFY( o <= reference );
|
|
|
|
VERIFY( reference <= o );
|
|
|
|
VERIFY( o >= reference );
|
|
|
|
VERIFY( reference >= o );
|
|
|
|
}
|
|
|
|
}
|