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_destructible
131468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
141468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant#include <type_traits>
151468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
16933afa9761c1c1f916161278a99284d50a594939Marshall Clowtemplate <class T>
171468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantvoid test_is_destructible()
181468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
19933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert( std::is_destructible<T>::value, "");
20933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert( std::is_destructible<const T>::value, "");
21933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert( std::is_destructible<volatile T>::value, "");
22933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert( std::is_destructible<const volatile T>::value, "");
23933afa9761c1c1f916161278a99284d50a594939Marshall Clow}
24933afa9761c1c1f916161278a99284d50a594939Marshall Clow
25933afa9761c1c1f916161278a99284d50a594939Marshall Clowtemplate <class T>
26933afa9761c1c1f916161278a99284d50a594939Marshall Clowvoid test_is_not_destructible()
27933afa9761c1c1f916161278a99284d50a594939Marshall Clow{
28933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert(!std::is_destructible<T>::value, "");
29933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert(!std::is_destructible<const T>::value, "");
30933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert(!std::is_destructible<volatile T>::value, "");
31933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert(!std::is_destructible<const volatile T>::value, "");
321468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant}
331468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
341468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantclass Empty
351468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
361468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant};
371468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
381468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantclass NotEmpty
391468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
401468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant    virtual ~NotEmpty();
411468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant};
421468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
431468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantunion Union {};
441468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
451468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantstruct bit_zero
461468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
471468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant    int :  0;
481468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant};
491468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
501468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantclass Abstract
511468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
521468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant    virtual ~Abstract() = 0;
531468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant};
541468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
551468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantstruct A
561468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
571468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant    ~A();
581468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant};
591468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant
60d1794072881115c9c4e0356c34a1f1af176cd4edHoward Hinnanttypedef void (Function) ();
61d1794072881115c9c4e0356c34a1f1af176cd4edHoward Hinnant
621468b668aa964beb1220e9b36162b092fb54952bHoward Hinnantint main()
631468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant{
64933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_destructible<A>();
65933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_destructible<int&>();
66933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_destructible<Union>();
67933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_destructible<Empty>();
68933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_destructible<int>();
69933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_destructible<double>();
70933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_destructible<int*>();
71933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_destructible<const int*>();
72933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_destructible<char[3]>();
73933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_destructible<bit_zero>();
7480e19ac90f90c5f2aef3d8a6a74b3ffd342ecd0eHoward Hinnant    test_is_destructible<int[3]>();
75933afa9761c1c1f916161278a99284d50a594939Marshall Clow
7680e19ac90f90c5f2aef3d8a6a74b3ffd342ecd0eHoward Hinnant    test_is_not_destructible<int[]>();
77933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_destructible<void>();
78933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_destructible<Abstract>();
79933afa9761c1c1f916161278a99284d50a594939Marshall Clow#if __has_feature(cxx_access_control_sfinae)
80933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_is_not_destructible<NotEmpty>();
81933afa9761c1c1f916161278a99284d50a594939Marshall Clow#endif
82d1794072881115c9c4e0356c34a1f1af176cd4edHoward Hinnant    test_is_not_destructible<Function>();
831468b668aa964beb1220e9b36162b092fb54952bHoward Hinnant}
84