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_copy_constructible
131468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
141468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant#include <type_traits>
151468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
16933afa9761c1c1f916161278a99284d50a594939Marshall Clowtemplate <class T>
171468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantvoid test_is_copy_constructible()
181468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
19933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert( std::is_copy_constructible<T>::value, "");
20933afa9761c1c1f916161278a99284d50a594939Marshall Clow}
21933afa9761c1c1f916161278a99284d50a594939Marshall Clow
22933afa9761c1c1f916161278a99284d50a594939Marshall Clowtemplate <class T>
23933afa9761c1c1f916161278a99284d50a594939Marshall Clowvoid test_is_not_copy_constructible()
24933afa9761c1c1f916161278a99284d50a594939Marshall Clow{
25933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert(!std::is_copy_constructible<T>::value, "");
261468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant}
271468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
281468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantclass Empty
291468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
301468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant};
311468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
321468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantclass NotEmpty
331468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
341468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantpublic:
351468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant    virtual ~NotEmpty();
361468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant};
371468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
381468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantunion Union {};
391468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
401468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantstruct bit_zero
411468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
421468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant    int :  0;
431468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant};
441468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
451468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantclass Abstract
461468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
471468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantpublic:
481468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant    virtual ~Abstract() = 0;
491468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant};
501468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
511468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantstruct A
521468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
531468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant    A(const A&);
541468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant};
551468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
566063ec176d5056683d6ddd310c2e3a8f1c7e1b46Howard Hinnantclass B
576063ec176d5056683d6ddd310c2e3a8f1c7e1b46Howard Hinnant{
586063ec176d5056683d6ddd310c2e3a8f1c7e1b46Howard Hinnant    B(const B&);
596063ec176d5056683d6ddd310c2e3a8f1c7e1b46Howard Hinnant};
606063ec176d5056683d6ddd310c2e3a8f1c7e1b46Howard Hinnant
617112dae6acac544a0271a85d95342c583441e2d1Dan Albertstruct C
627112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
637112dae6acac544a0271a85d95342c583441e2d1Dan Albert    C(C&);  // not const
647112dae6acac544a0271a85d95342c583441e2d1Dan Albert    void operator=(C&);  // not const
657112dae6acac544a0271a85d95342c583441e2d1Dan Albert};
667112dae6acac544a0271a85d95342c583441e2d1Dan Albert
671468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantint main()
681468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
69933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_copy_constructible<A>();
70933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_copy_constructible<int&>();
71933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_copy_constructible<Union>();
72933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_copy_constructible<Empty>();
73933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_copy_constructible<int>();
74933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_copy_constructible<double>();
75933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_copy_constructible<int*>();
76933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_copy_constructible<const int*>();
77933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_copy_constructible<NotEmpty>();
78933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_copy_constructible<bit_zero>();
791468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
80933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_copy_constructible<char[3]>();
81933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_copy_constructible<char[]>();
82933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_copy_constructible<void>();
83933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_copy_constructible<Abstract>();
847112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test_is_not_copy_constructible<C>();
85933afa9761c1c1f916161278a99284d50a594939Marshall Clow#if __has_feature(cxx_access_control_sfinae)
86933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_copy_constructible<B>();
87933afa9761c1c1f916161278a99284d50a594939Marshall Clow#endif
881468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant}
89