blob: d33019bcba9ec0175631577a21fddcc392ba4b72 [file] [log] [blame]
Howard Hinnant1468b662010-11-19 22:17:28 +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// type_traits
11
12// is_assignable
13
14#include <type_traits>
15
16struct A
17{
18};
19
20struct B
21{
22 void operator=(A);
23};
24
Marshall Clow933afa92013-07-04 00:10:01 +000025template <class T, class U>
26void test_is_assignable()
27{
28 static_assert(( std::is_assignable<T, U>::value), "");
29}
30
31template <class T, class U>
32void test_is_not_assignable()
33{
34 static_assert((!std::is_assignable<T, U>::value), "");
35}
36
Howard Hinnant01afa5c2013-09-02 20:30:37 +000037struct D;
38
Marshall Clowf1d10872014-04-17 18:11:38 +000039#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant01afa5c2013-09-02 20:30:37 +000040struct C
41{
42 template <class U>
43 D operator,(U&&);
44};
45
46struct E
47{
48 C operator=(int);
49};
Marshall Clowf1d10872014-04-17 18:11:38 +000050#endif
Howard Hinnant01afa5c2013-09-02 20:30:37 +000051
Marshall Clow3a4964a2015-04-14 13:53:53 +000052template <typename T>
53struct X { T t; };
54
Howard Hinnant1468b662010-11-19 22:17:28 +000055int main()
56{
Marshall Clow933afa92013-07-04 00:10:01 +000057 test_is_assignable<int&, int&> ();
58 test_is_assignable<int&, int> ();
59 test_is_assignable<int&, double> ();
60 test_is_assignable<B, A> ();
61 test_is_assignable<void*&, void*> ();
62
63#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Marshall Clowf1d10872014-04-17 18:11:38 +000064 test_is_assignable<E, int> ();
65
Marshall Clow933afa92013-07-04 00:10:01 +000066 test_is_not_assignable<int, int&> ();
67 test_is_not_assignable<int, int> ();
68#endif
69 test_is_not_assignable<A, B> ();
70 test_is_not_assignable<void, const void> ();
71 test_is_not_assignable<const void, const void> ();
72 test_is_not_assignable<int(), int> ();
Marshall Clow3a4964a2015-04-14 13:53:53 +000073
74// pointer to incomplete template type
75 test_is_assignable<X<D>*&, X<D>*> ();
Howard Hinnant1468b662010-11-19 22:17:28 +000076}