2 // (C) Copyright John Maddock 2000.
3 // Use, modification and distribution are subject to the
4 // Boost Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 # include <type_traits>
10 # include <boost/type_traits/is_polymorphic.hpp>
13 #include "check_integral_constant.hpp"
19 #if defined(BOOST_WINDOWS) && !defined(BOOST_DISABLE_WIN32)
20 #include <windows.h> // more things to test
23 #if defined(BOOST_MSVC) && (_MSC_VER >= 1700)
24 #pragma warning(disable:4250)
27 // this test was added to check for bug reported on 21 May 2003:
28 struct poly_bug
{ virtual int foo() = 0; };
30 TT_TEST_BEGIN(is_polymorphic
)
32 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<int>::value
, false);
33 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<const int>::value
, false);
34 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<volatile int>::value
, false);
35 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<int*>::value
, false);
36 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<int* const>::value
, false);
37 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<int[2]>::value
, false);
38 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<int&>::value
, false);
39 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
40 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<int&&>::value
, false);
42 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<mf4
>::value
, false);
43 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<f1
>::value
, false);
44 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<enum_UDT
>::value
, false);
46 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<UDT
>::value
, false);
47 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<empty_UDT
>::value
, false);
49 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<UDT
*>::value
, false);
50 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<UDT
[2]>::value
, false);
51 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<UDT
&>::value
, false);
52 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<void>::value
, false);
54 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<VB
>::value
, true);
55 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<VD
>::value
, true);
56 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<test_abc1
>::value
, true);
57 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<test_abc2
>::value
, true);
58 #ifndef BOOST_NO_STD_LOCALE
59 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<std::iostream
>::value
, true);
60 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<std::basic_streambuf
<char> >::value
, true);
61 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<std::basic_ios
<char> >::value
, true);
62 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<std::basic_istream
<char> >::value
, true);
63 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<std::basic_streambuf
<char> >::value
, true);
64 // some libraries don't make this one a polymorphic class, since this is a library
65 // rather than a type traits issue we won't test this for now...
66 //BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic<std::ios_base>::value, true);
68 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<std::exception
>::value
, true);
69 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<std::bad_alloc
>::value
, true);
70 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<std::runtime_error
>::value
, true);
71 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<std::out_of_range
>::value
, true);
72 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<std::range_error
>::value
, true);
74 #if defined(BOOST_WINDOWS) && !defined(BOOST_DISABLE_WIN32)
75 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<IUnknown
>::value
, true);
76 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<ITypeInfo
>::value
, true);
77 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<ITypeComp
>::value
, true);
78 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<IDispatch
>::value
, true);
82 // this test was added to check for bug reported on 21 May 2003:
83 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<poly_bug
>::value
, true);
85 #ifndef BOOST_NO_CXX11_FINAL
86 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
< final_UDT
>::value
, false);
87 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic
<polymorphic_derived_final
>::value
, true);