11468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant//===----------------------------------------------------------------------===//
21468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant//
31468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant//                     The LLVM Compiler Infrastructure
41468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant//
51468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
61468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
71468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant//
81468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant//===----------------------------------------------------------------------===//
91468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
101468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant// type_traits
111468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
121468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant// is_assignable
131468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
141468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant#include <type_traits>
151468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
161468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantstruct A
171468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
181468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant};
191468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
201468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantstruct B
211468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
221468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant    void operator=(A);
231468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant};
241468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
25933afa9761c1c1f916161278a99284d50a594939Marshall Clowtemplate <class T, class U>
26933afa9761c1c1f916161278a99284d50a594939Marshall Clowvoid test_is_assignable()
27933afa9761c1c1f916161278a99284d50a594939Marshall Clow{
28933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert(( std::is_assignable<T, U>::value), "");
29933afa9761c1c1f916161278a99284d50a594939Marshall Clow}
30933afa9761c1c1f916161278a99284d50a594939Marshall Clow
31933afa9761c1c1f916161278a99284d50a594939Marshall Clowtemplate <class T, class U>
32933afa9761c1c1f916161278a99284d50a594939Marshall Clowvoid test_is_not_assignable()
33933afa9761c1c1f916161278a99284d50a594939Marshall Clow{
34933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert((!std::is_assignable<T, U>::value), "");
35933afa9761c1c1f916161278a99284d50a594939Marshall Clow}
36933afa9761c1c1f916161278a99284d50a594939Marshall Clow
3701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantstruct D;
3801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant
3901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantstruct C
4001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant{
4101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant    template <class U>
4201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant    D operator,(U&&);
4301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant};
4401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant
4501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantstruct E
4601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant{
4701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant    C operator=(int);
4801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant};
4901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant
501468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantint main()
511468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
52933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_assignable<int&, int&> ();
53933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_assignable<int&, int> ();
54933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_assignable<int&, double> ();
55933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_assignable<B, A> ();
56933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_assignable<void*&, void*> ();
5701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant    test_is_assignable<E, int> ();
58933afa9761c1c1f916161278a99284d50a594939Marshall Clow
59933afa9761c1c1f916161278a99284d50a594939Marshall Clow#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
60933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_assignable<int, int&> ();
61933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_assignable<int, int> ();
62933afa9761c1c1f916161278a99284d50a594939Marshall Clow#endif
63933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_assignable<A, B> ();
64933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_assignable<void, const void> ();
65933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_assignable<const void, const void> ();
66933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_assignable<int(), int> ();
671468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant}
68