diff options
Diffstat (limited to 'test/support/is_transparent.h')
-rw-r--r-- | test/support/is_transparent.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/test/support/is_transparent.h b/test/support/is_transparent.h new file mode 100644 index 000000000000..58255248abc9 --- /dev/null +++ b/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 <class T, class U> + constexpr auto operator()(T&& t, U&& u) const + noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u))) + -> decltype (std::forward<T>(t) < std::forward<U>(u)) + { return std::forward<T>(t) < std::forward<U>(u); } + typedef void is_transparent; // correct +}; + +struct transparent_less_no_type +{ + template <class T, class U> + constexpr auto operator()(T&& t, U&& u) const + noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u))) + -> decltype (std::forward<T>(t) < std::forward<U>(u)) + { return std::forward<T>(t) < std::forward<U>(u); } +private: +// typedef void is_transparent; // error - should exist +}; + +struct transparent_less_private +{ + template <class T, class U> + constexpr auto operator()(T&& t, U&& u) const + noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u))) + -> decltype (std::forward<T>(t) < std::forward<U>(u)) + { return std::forward<T>(t) < std::forward<U>(u); } +private: + typedef void is_transparent; // error - should be accessible +}; + +struct transparent_less_not_a_type +{ + template <class T, class U> + constexpr auto operator()(T&& t, U&& u) const + noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u))) + -> decltype (std::forward<T>(t) < std::forward<U>(u)) + { return std::forward<T>(t) < std::forward<U>(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 |