15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is dual licensed under the MIT and the University of Illinois Open
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Source Licenses. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type_traits
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// is_copy_assignable
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <type_traits>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void test_is_copy_assignable()
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    static_assert(( std::is_copy_assignable<T>::value), "");
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void test_is_not_copy_assignable()
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_assert((!std::is_copy_assignable<T>::value), "");
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Empty
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class NotEmpty
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochpublic:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~NotEmpty();
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdochunion Union {};
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstruct bit_zero
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch{
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    int :  0;
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstruct A
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch{
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    A();
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class B
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    B& operator=(const B&);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main()
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_is_copy_assignable<int> ();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_is_copy_assignable<int&> ();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_is_copy_assignable<A> ();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_is_copy_assignable<bit_zero> ();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_is_copy_assignable<Union> ();
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    test_is_copy_assignable<NotEmpty> ();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_is_copy_assignable<Empty> ();
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_is_not_copy_assignable<const int> ();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_is_not_copy_assignable<int[]> ();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_is_not_copy_assignable<int[3]> ();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if __has_feature(cxx_access_control_sfinae)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_is_not_copy_assignable<B> ();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_is_not_copy_assignable<void> ();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)