diff --git a/libcxx/test/support/is_transparent.h b/libcxx/test/support/is_transparent.h new file mode 100644 index 000000000000..58255248abc9 --- /dev/null +++ b/libcxx/test/support/is_transparent.h @@ -0,0 +1,73 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef TRANSPARENT_H +#define TRANSPARENT_H + +// testing transparent +#if _LIBCPP_STD_VER > 11 + +struct transparent_less +{ + template + constexpr auto operator()(T&& t, U&& u) const + noexcept(noexcept(std::forward(t) < std::forward(u))) + -> decltype (std::forward(t) < std::forward(u)) + { return std::forward(t) < std::forward(u); } + typedef void is_transparent; // correct +}; + +struct transparent_less_no_type +{ + template + constexpr auto operator()(T&& t, U&& u) const + noexcept(noexcept(std::forward(t) < std::forward(u))) + -> decltype (std::forward(t) < std::forward(u)) + { return std::forward(t) < std::forward(u); } +private: +// typedef void is_transparent; // error - should exist +}; + +struct transparent_less_private +{ + template + constexpr auto operator()(T&& t, U&& u) const + noexcept(noexcept(std::forward(t) < std::forward(u))) + -> decltype (std::forward(t) < std::forward(u)) + { return std::forward(t) < std::forward(u); } +private: + typedef void is_transparent; // error - should be accessible +}; + +struct transparent_less_not_a_type +{ + template + constexpr auto operator()(T&& t, U&& u) const + noexcept(noexcept(std::forward(t) < std::forward(u))) + -> decltype (std::forward(t) < std::forward(u)) + { return std::forward(t) < std::forward(u); } + + int is_transparent; // error - should be a type +}; + +struct C2Int { // comparable to int + C2Int() : i_(0) {} + C2Int(int i): i_(i) {} + int get () const { return i_; } +private: + int i_; + }; + +bool operator <(int rhs, const C2Int& lhs) { return rhs < lhs.get(); } +bool operator <(const C2Int& rhs, const C2Int& lhs) { return rhs.get() < lhs.get(); } +bool operator <(const C2Int& rhs, int lhs) { return rhs.get() < lhs; } + +#endif + +#endif // TRANSPARENT_H