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