blob: 541689314b8bcc9a001acd27955daf35fcb49881 [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); }
25 typedef void is_transparent; // correct
26};
27
28struct transparent_less_no_type
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); }
35private:
36// typedef void is_transparent; // error - should exist
37};
38
39struct transparent_less_private
40{
41 template <class T, class U>
42 constexpr auto operator()(T&& t, U&& u) const
43 noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
44 -> decltype (std::forward<T>(t) < std::forward<U>(u))
45 { return std::forward<T>(t) < std::forward<U>(u); }
46private:
47 typedef void is_transparent; // error - should be accessible
48};
49
50struct transparent_less_not_a_type
51{
52 template <class T, class U>
53 constexpr auto operator()(T&& t, U&& u) const
54 noexcept(noexcept(std::forward<T>(t) < std::forward<U>(u)))
55 -> decltype (std::forward<T>(t) < std::forward<U>(u))
56 { return std::forward<T>(t) < std::forward<U>(u); }
57
58 int is_transparent; // error - should be a type
59};
60
61struct C2Int { // comparable to int
62 C2Int() : i_(0) {}
63 C2Int(int i): i_(i) {}
64 int get () const { return i_; }
65private:
66 int i_;
67 };
Eric Fiselierd04c6852016-06-01 21:35:39 +000068
Marshall Clow5b03e1a2015-06-30 18:16:12 +000069bool operator <(int rhs, const C2Int& lhs) { return rhs < lhs.get(); }
70bool operator <(const C2Int& rhs, const C2Int& lhs) { return rhs.get() < lhs.get(); }
71bool operator <(const C2Int& rhs, int lhs) { return rhs.get() < lhs; }
72
73#endif
74
75#endif // TRANSPARENT_H