blob: f7cdbbc14ccd566d10ddcfd3b07a1d8d36c75473 [file] [log] [blame]
Marshall Clow5b03e1a2015-06-30 18:16:12 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef TRANSPARENT_H
11#define TRANSPARENT_H
12
Stephan T. Lavavej0f901c72016-11-04 20:26:59 +000013#include "test_macros.h"
14
Eric Fiselierd04c6852016-06-01 21:35:39 +000015// testing transparent
Stephan T. Lavavej0f901c72016-11-04 20:26:59 +000016#if TEST_STD_VER > 11
Marshall Clow5b03e1a2015-06-30 18:16:12 +000017
18struct transparent_less
19{
20 template <class T, class U>
21 constexpr auto operator()(T&& t, U&& u) const
22 noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
23 -> decltype (std::forward<T>(t) < std::forward<U>(u))
24 { return std::forward<T>(t) < std::forward<U>(u); }
Marshall Clowb707e7f2017-06-13 14:34:58 +000025 using is_transparent = void; // correct
26};
27
28struct transparent_less_not_referenceable
29{
30 template <class T, class U>
31 constexpr auto operator()(T&& t, U&& u) const
32 noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
33 -> decltype (std::forward<T>(t) < std::forward<U>(u))
34 { return std::forward<T>(t) < std::forward<U>(u); }
35 using is_transparent = void () const &; // it's a type; a weird one, but a type
Marshall Clow5b03e1a2015-06-30 18:16:12 +000036};
37
38struct transparent_less_no_type
39{
40 template <class T, class U>
41 constexpr auto operator()(T&& t, U&& u) const
42 noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
43 -> decltype (std::forward<T>(t) < std::forward<U>(u))
44 { return std::forward<T>(t) < std::forward<U>(u); }
45private:
Marshall Clowb707e7f2017-06-13 14:34:58 +000046// using is_transparent = void; // error - should exist
Marshall Clow5b03e1a2015-06-30 18:16:12 +000047};
48
49struct transparent_less_private
50{
51 template <class T, class U>
52 constexpr auto operator()(T&& t, U&& u) const
53 noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
54 -> decltype (std::forward<T>(t) < std::forward<U>(u))
55 { return std::forward<T>(t) < std::forward<U>(u); }
56private:
Marshall Clowb707e7f2017-06-13 14:34:58 +000057 using is_transparent = void; // error - should be accessible
Marshall Clow5b03e1a2015-06-30 18:16:12 +000058};
59
60struct transparent_less_not_a_type
61{
62 template <class T, class U>
63 constexpr auto operator()(T&& t, U&& u) const
64 noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
65 -> decltype (std::forward<T>(t) < std::forward<U>(u))
66 { return std::forward<T>(t) < std::forward<U>(u); }
67
68 int is_transparent; // error - should be a type
69};
70
71struct C2Int { // comparable to int
72 C2Int() : i_(0) {}
73 C2Int(int i): i_(i) {}
74 int get () const { return i_; }
75private:
76 int i_;
77 };
Eric Fiselierd04c6852016-06-01 21:35:39 +000078
Marshall Clow5b03e1a2015-06-30 18:16:12 +000079bool operator <(int rhs, const C2Int& lhs) { return rhs < lhs.get(); }
80bool operator <(const C2Int& rhs, const C2Int& lhs) { return rhs.get() < lhs.get(); }
81bool operator <(const C2Int& rhs, int lhs) { return rhs.get() < lhs; }
82
83#endif
84
85#endif // TRANSPARENT_H