Add tests making sure that optional<T>s can be compared at compile time; this functionality was enabled by N3789

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@192051 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Marshall Clow 2013-10-05 23:29:16 +00:00
parent 79d8c99a62
commit 2faa02fc3d
4 changed files with 43 additions and 41 deletions

View File

@ -14,11 +14,25 @@
#include <optional>
#if _LIBCPP_STD_VER > 11
struct X
{
int i_;
constexpr X(int i) : i_(i) {}
};
constexpr bool operator == ( const X &rhs, const X &lhs )
{ return rhs.i_ == lhs.i_ ; }
#endif
int main()
{
#if _LIBCPP_STD_VER > 11
{
typedef int T;
typedef X T;
typedef std::optional<T> O;
constexpr T val(2);
@ -26,16 +40,16 @@ int main()
constexpr O o2{1}; // engaged
constexpr O o3{val}; // engaged
static_assert ( !(o1 == 1), "" );
static_assert ( o2 == 1, "" );
static_assert ( !(o3 == 1), "" );
static_assert ( o3 == 2 , "" );
static_assert ( !(o1 == T(1)), "" );
static_assert ( o2 == T(1), "" );
static_assert ( !(o3 == T(1)), "" );
static_assert ( o3 == T(2) , "" );
static_assert ( o3 == val, "" );
static_assert ( !(1 == o1), "" );
static_assert ( 1 == o2, "" );
static_assert ( !(1 == o3), "" );
static_assert ( 2 == o3 , "" );
static_assert ( !(T(1) == o1), "" );
static_assert ( T(1) == o2, "" );
static_assert ( !(T(1) == o3), "" );
static_assert ( T(2) == o3 , "" );
static_assert ( val == o3 , "" );
}
#endif

View File

@ -23,22 +23,9 @@ struct X
constexpr X(int i) : i_(i) {}
};
namespace std
{
template <>
struct less<X>
{
constexpr
bool
operator()(const X& x, const X& y) const
{
return x.i_ < y.i_;
}
};
}
constexpr bool operator < ( const X &rhs, const X &lhs )
{ return rhs.i_ < lhs.i_ ; }
#endif
int main()

View File

@ -15,11 +15,25 @@
#include <type_traits>
#include <cassert>
#if _LIBCPP_STD_VER > 11
struct X
{
int i_;
constexpr X(int i) : i_(i) {}
};
constexpr bool operator == ( const X &rhs, const X &lhs )
{ return rhs.i_ == lhs.i_ ; }
#endif
int main()
{
#if _LIBCPP_STD_VER > 11
{
typedef int T;
typedef X T;
typedef std::optional<T> O;
constexpr O o1; // disengaged

View File

@ -22,21 +22,8 @@ struct X
constexpr X(int i) : i_(i) {}
};
namespace std
{
template <>
struct less<X>
{
constexpr
bool
operator()(const X& x, const X& y) const
{
return x.i_ < y.i_;
}
};
}
constexpr bool operator < ( const X &rhs, const X &lhs )
{ return rhs.i_ < lhs.i_ ; }
#endif