Boost logo

Boost :

From: David Abrahams (david.abrahams_at_[hidden])
Date: 2002-02-21 20:04:41


I've fixed is_POD for array types on compilers not supporting partial
specialization. The patch is appended but I have also checked it in.

About the testing methodology: It seems as though the tests are engineered
so we won't know when something gets fixed. Tests which are expected to fail
to compile on a given compiler never actually happen. The number of failures
reportedly expected for a compiler (e.g. msvc/object_type_traits_test) may
far exceed the number set in the expected_failures variable for any given
test. What can we do so that the status of a given trait on a given compiler
is more-reliably reported? We have everything we need in status/Jamfile in
order to get fine-grained and accurate reports.

I also made the following change. It causes tests to fail if they don't
match their expected number of failures exactly. I needed to do that in
order to see that the change fixed anything:

######################

Index: boost/type_traits/type_traits_test.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/type_traits/type_traits_test.hpp,v
retrieving revision 1.16
diff -r1.16 type_traits_test.hpp
45c45
< return (failures <= expected_failures) ? 0 : failures;

---
>    return (failures == expected_failures) ? 0 : (failures != 0) ? failures
: -1;
######################
That uncovered the following discrepancies (so expect the regression status
to get much worse until we correct our expectations):
succeeded-test-file
e:\boost-build\status\bin\alignment_test.test\metrowerks\debug\runtime-link-
dynamic\alignment_test.test
***************** failed above test: alignment_test  ********************
14 tests completed, 0 failures found, 5 failures expected from this
compiler.
succeeded-test-file
e:\boost-build\status\bin\composite_traits_test.test\msvc\debug\runtime-link
-dynamic\composite_traits_test.test
***************** failed above test: composite_traits_test
********************
82 tests completed, 0 failures found, 1 failures expected from this
compiler.
succeeded-test-file
e:\boost-build\status\bin\cv_traits_test.test\gcc\debug\runtime-link-dynamic
\cv_traits_test.test
*
***************** failed above test: cv_traits_test  ********************
checking value of boost::is_const<cr_type>::value...failed
   boost::is_const<cr_type>::value does not compile on this compiler
24 tests completed, 1 failures found, 2 failures expected from this
compiler.
succeeded-test-file
e:\boost-build\status\bin\cv_traits_test.test\mingw\debug\runtime-link-dynam
ic\cv_traits_test.test
*
***************** failed above test: cv_traits_test  ********************
checking value of boost::is_const<cr_type>::value...failed
   boost::is_const<cr_type>::value does not compile on this compiler
24 tests completed, 1 failures found, 2 failures expected from this
compiler.
succeeded-test-file
e:\boost-build\status\bin\is_convertible_test.test\borland\debug\runtime-lin
k-dynamic\is_convertible_test.test
*
***************** failed above test: is_convertible_test
********************
*
succeeded-test-file
e:\boost-build\status\bin\is_convertible_test.test\metrowerks\debug\runtime-
link-dynamic\is_convertible_test.test
*
***************** failed above test: is_convertible_test
********************
<snip>
54 tests completed, 35 failures found, 0 failures expected from this
compiler.
succeeded-test-file
e:\boost-build\status\bin\object_type_traits_test.test\intel-win32\debug\run
time-link-dynamic\object_type_traits_test.test
*
***************** failed above test: object_type_traits_test
********************
<snip>
201 tests completed, 7 failures found, 10 failures expected from this
compiler.
succeeded-test-file
e:\boost-build\status\bin\object_type_traits_test.test\metrowerks\debug\runt
ime-link-dynamic\object_type_traits_test.test
*
***************** failed above test: object_type_traits_test
********************
<snip>
201 tests completed, 21 failures found, 19 failures expected from this
compiler.
######################
? libs/type_traits/tests/subjamfile
Index: boost/type_traits/object_traits.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/type_traits/object_traits.hpp,v
retrieving revision 1.14
diff -r1.14 object_traits.hpp
135a136,137
>
> #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
138,139c140,142
<    BOOST_STATIC_CONSTANT(bool, value =
<       (::boost::type_traits::ice_or<
---
>     BOOST_STATIC_CONSTANT(
>         bool, value =
>         (::boost::type_traits::ice_or<
143c146
<       >::value));
---
>          >::value));
145c148
< #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
---
>
150a154,227
> #else
> namespace detail
> {
>   template <bool is_array = false> struct is_POD_helper;
> }
>
> template <typename T> struct is_POD
>
>    BOOST_STATIC_CONSTANT(
>        bool, value = (
>            ::boost::detail::is_POD_helper<
>               ::boost::is_array<T>::value
>            >::template apply<T>::value
>            )
>        );
> };
>
> namespace detail
> {
>   template <bool is_array>
>   struct is_POD_helper
>   {
>       template <typename T> struct apply
>       {
>           BOOST_STATIC_CONSTANT(
>               bool, value =
>               (::boost::type_traits::ice_or<
>                ::boost::is_scalar<T>::value,
>                ::boost::is_void<T>::value,
>                BOOST_IS_POD(T)
>                >::value));
>       };
>   };
>
>   template <bool b>
>   struct bool_to_type
>   {
>       typedef ::boost::type_traits::no_type type;
>   };
>
>   template <>
>   struct bool_to_type<true>
>   {
>       typedef ::boost::type_traits::yes_type type;
>   };
>
>   template <class ArrayType>
>   struct is_POD_array_helper
>   {
>       typedef
> #if !defined(__BORLANDC__) || __BORLANDC__ > 0x551
>       typename
> #endif
>
::boost::detail::bool_to_type<(::boost::is_POD<ArrayType>::value)>::type
type;
>
>       type instance() const;
>   };
>
>   template <class T>
>   is_POD_array_helper<T> is_POD_array(T*);
>
>   template <>
>   struct is_POD_helper<true>
>   {
>       template <typename T> struct apply
>       {
>           static T& help();
>
>           BOOST_STATIC_CONSTANT(
>               bool, value =
>               sizeof(is_POD_array(help()).instance()) > 1);
>       };
>   };
> }
Index: libs/type_traits/tests/object_type_traits_test.cpp
===================================================================
RCS file:
/cvsroot/boost/boost/libs/type_traits/tests/object_type_traits_test.cpp,v
retrieving revision 1.17
diff -r1.17 object_type_traits_test.cpp
308c308
< unsigned int expected_failures = 24;
---
> unsigned int expected_failures = 16;
+---------------------------------------------------------------+
                  David Abrahams
      C++ Booster (http://www.boost.org)               O__  ==
      Pythonista (http://www.python.org)              c/ /'_ ==
  resume: http://users.rcn.com/abrahams/resume.html  (*) \(*) ==
          email: david.abrahams_at_[hidden]
+---------------------------------------------------------------+

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk