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