Author: vitek Date: Wed Jul 9 17:48:07 2008 New Revision: 675393 URL: http://svn.apache.org/viewvc?rev=675393&view=rev Log: 2008-07-09 Travis Vitek <[EMAIL PROTECTED]>
STDCXX-916 * include/rw/_config-msvc.h: Fix definition of _RWSTD_TT_ALIGNED_POD broken in r675050. * include/rw/_meta_rel.h: Update comments for __rw_is_base_of_impl<>, simplify implementation a tiny bit. Move __rw_is_convertible_impl<> down to avoid defining it unless necessary. Remove stray tabs. [_MSC_VER]: Add fallback for __rw_is_convertible to detect void-void conversions. * include/rw/_meta_cat.h: Remove stray tab. * include/rw/_meta_comp.h: Remove stray tabs. * include/rw/_meta_prop.h: Fix typos in template __rw_is_empty_impl<>. * tests/utilities/20.meta.rel.cpp (test_is_base_of): Add additional test cases. (test_is_convertible): Ditto. Modified: stdcxx/branches/4.3.x/include/rw/_config-msvc.h stdcxx/branches/4.3.x/include/rw/_meta_cat.h stdcxx/branches/4.3.x/include/rw/_meta_comp.h stdcxx/branches/4.3.x/include/rw/_meta_prop.h stdcxx/branches/4.3.x/include/rw/_meta_rel.h stdcxx/branches/4.3.x/tests/utilities/20.meta.rel.cpp Modified: stdcxx/branches/4.3.x/include/rw/_config-msvc.h URL: http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/include/rw/_config-msvc.h?rev=675393&r1=675392&r2=675393&view=diff ============================================================================== --- stdcxx/branches/4.3.x/include/rw/_config-msvc.h (original) +++ stdcxx/branches/4.3.x/include/rw/_config-msvc.h Wed Jul 9 17:48:07 2008 @@ -112,7 +112,7 @@ # define _RWSTD_TT_ALIGN_OF(T) __alignof(T) # define _RWSTD_TT_ALIGNED_POD(N) \ - struct {__declspec(align(Align)) unsigned char _C_align; } + struct {__declspec(align(N)) unsigned char _C_align; } # define _RWSTD_TT_MAX_ALIGNMENT 8192 #endif // _MSC_FULL_VER >= 140050215 Modified: stdcxx/branches/4.3.x/include/rw/_meta_cat.h URL: http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/include/rw/_meta_cat.h?rev=675393&r1=675392&r2=675393&view=diff ============================================================================== --- stdcxx/branches/4.3.x/include/rw/_meta_cat.h (original) +++ stdcxx/branches/4.3.x/include/rw/_meta_cat.h Wed Jul 9 17:48:07 2008 @@ -312,7 +312,7 @@ struct __rw_is_function_impl<_TypeT, false> { typedef _TypeT& _TypeT_Ref; - typedef _TypeT* _TypeT_Ptr; + typedef _TypeT* _TypeT_Ptr; struct _C_no { }; struct _C_yes { _C_no __pad [2]; }; Modified: stdcxx/branches/4.3.x/include/rw/_meta_comp.h URL: http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/include/rw/_meta_comp.h?rev=675393&r1=675392&r2=675393&view=diff ============================================================================== --- stdcxx/branches/4.3.x/include/rw/_meta_comp.h (original) +++ stdcxx/branches/4.3.x/include/rw/_meta_comp.h Wed Jul 9 17:48:07 2008 @@ -38,7 +38,7 @@ template <class _TypeT> struct __rw_is_reference : __rw_integral_constant<bool, - __rw_is_lvalue_reference<_TypeT>::value + __rw_is_lvalue_reference<_TypeT>::value || __rw_is_rvalue_reference<_TypeT>::value> { }; @@ -48,7 +48,7 @@ template <class _TypeT> struct __rw_is_arithmetic : __rw_integral_constant<bool, - __rw_is_integral<_TypeT>::value + __rw_is_integral<_TypeT>::value || __rw_is_floating_point<_TypeT>::value> { }; @@ -79,7 +79,7 @@ template <class _TypeT> struct __rw_is_member_pointer : __rw_integral_constant<bool, - __rw_is_member_function_pointer<_TypeT>::value + __rw_is_member_function_pointer<_TypeT>::value || __rw_is_member_object_pointer<_TypeT>::value> { }; Modified: stdcxx/branches/4.3.x/include/rw/_meta_prop.h URL: http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/include/rw/_meta_prop.h?rev=675393&r1=675392&r2=675393&view=diff ============================================================================== --- stdcxx/branches/4.3.x/include/rw/_meta_prop.h (original) +++ stdcxx/branches/4.3.x/include/rw/_meta_prop.h Wed Jul 9 17:48:07 2008 @@ -157,10 +157,10 @@ #elif defined (_MSC_VER) template <class _TypeT> -struct __rw_is_empty_impl<_TypeT> +struct __rw_is_empty_impl { - enum { _C_value = __rw_is_class<_TypeT>::value - && _RWSTD_TT_IS_EMPTY (_TypeT) }; + enum { _C_value = __rw_is_class<_TypeT>::value + && _RWSTD_TT_IS_EMPTY (_TypeT) }; }; Modified: stdcxx/branches/4.3.x/include/rw/_meta_rel.h URL: http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/include/rw/_meta_rel.h?rev=675393&r1=675392&r2=675393&view=diff ============================================================================== --- stdcxx/branches/4.3.x/include/rw/_meta_rel.h (original) +++ stdcxx/branches/4.3.x/include/rw/_meta_rel.h Wed Jul 9 17:48:07 2008 @@ -60,36 +60,9 @@ #define _RWSTD_IS_SAME(T,U) _RW::__rw_is_same<T,U>::value - -template <class _From, class _To> -struct __rw_is_convertible_impl -{ - struct _C_no { }; - struct _C_yes { _C_no __pad [2]; }; - - struct _Dummy - { - template <class _Anything> - _Dummy (_Anything); - }; - - template <class _TypeT> - static _C_no _C_is (_Dummy, _TypeT); - static _C_yes _C_is (_To, int); - - static _From _C_make (); - - enum { _C_value = sizeof (_C_yes) == sizeof (_C_is (_C_make (), 0)) }; -}; - - - #ifndef _RWSTD_TT_IS_BASE_OF // -// This fallback tests if a pointer to _Base is convertible to a -// pointer of _Derived after both types have been cv-stripped. -// // This little gem was taken from a comp.lang.c++.moderated post // by Rani Sharoni [see http://tinyurl.com/6pdv3k] // @@ -104,6 +77,9 @@ struct _C_no { }; struct _C_yes { _C_no __pad [2]; }; + // the template is used so that the compiler will prefer the + // non-template _C_is, in case that the conversion would be + // ambiguous (as it is in the case where the types are unrelated). template <class _TypeT> static _C_yes _C_is (_NoCV_Derived&, _TypeT); static _C_no _C_is (_NoCV_Base& , int); @@ -114,11 +90,9 @@ operator _NoCV_Derived& (); }; - static _C_nest _C_make (); - enum { _C_value = __rw_is_same<_NoCV_Base, _NoCV_Derived>::value - || sizeof (_C_yes) == sizeof (_C_is (_C_make (), 0)) }; + || sizeof (_C_yes) == sizeof (_C_is (_C_nest (), 0)) }; }; // @@ -148,6 +122,28 @@ #ifndef _RWSTD_TT_IS_CONVERTIBLE + +template <class _From, class _To> +struct __rw_is_convertible_impl +{ + struct _C_no { }; + struct _C_yes { _C_no __pad [2]; }; + + struct _Dummy + { + template <class _Anything> + _Dummy (_Anything); + }; + + template <class _TypeT> + static _C_no _C_is (_Dummy, _TypeT); + static _C_yes _C_is (_To, int); + + static _From _C_make (); + + enum { _C_value = sizeof (_C_yes) == sizeof (_C_is (_C_make (), 0)) }; +}; + template <class _TypeT, class _TypeU, bool = __rw_is_array<_TypeT>::value, bool = __rw_is_function<_TypeT>::value> @@ -166,7 +162,7 @@ typedef typename __rw_add_pointer<_TypeV>::type _TypeT_Ptr; enum { _C_value = - __rw_is_convertible_impl<_TypeT_Ptr, _TypeU>::_C_value }; + __rw_is_convertible_impl<_TypeT_Ptr, _TypeU>::_C_value }; }; template <class _TypeT, class _TypeU> @@ -177,7 +173,7 @@ typedef typename __rw_add_pointer<_TypeT>::type _TypeT_Ptr; enum { _C_value = - __rw_is_convertible_impl<_TypeT_Ref, _TypeU>::_C_value + __rw_is_convertible_impl<_TypeT_Ref, _TypeU>::_C_value || __rw_is_convertible_impl<_TypeT_Ptr, _TypeU>::_C_value }; }; @@ -222,6 +218,21 @@ # define _RWSTD_TT_IS_CONVERTIBLE(T,U) \ _RW::__rw_is_convertible_1<T,U>::_C_value + +#elif defined (_MSC_VER) + +template <class _TypeT, class _TypeU> +struct __rw_is_convertible_1 +{ + enum { _C_value = + __rw_is_void<_TypeT>::value && __rw_is_void<_TypeU>::value + || _RWSTD_TT_IS_CONVERTIBLE(_TypeT, _TypeU) }; +}; + +# undef _RWSTD_TT_IS_CONVERTIBLE +# define _RWSTD_TT_IS_CONVERTIBLE(T,U) \ + _RW::__rw_is_convertible_1<T,U>::_C_value + #endif // _RWSTD_TT_IS_CONVERTIBLE template <class _TypeT, class _TypeU> Modified: stdcxx/branches/4.3.x/tests/utilities/20.meta.rel.cpp URL: http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/tests/utilities/20.meta.rel.cpp?rev=675393&r1=675392&r2=675393&view=diff ============================================================================== --- stdcxx/branches/4.3.x/tests/utilities/20.meta.rel.cpp (original) +++ stdcxx/branches/4.3.x/tests/utilities/20.meta.rel.cpp Wed Jul 9 17:48:07 2008 @@ -225,6 +225,12 @@ TEST (std::is_base_of, int[], int*, false); TEST (std::is_base_of, int*, int[], false); + + TEST (std::is_base_of, struct_A, class_B, false); + TEST (std::is_base_of, class_B, struct_A, false); + + TEST (std::is_base_of, derived_<struct_A>, struct_A, false); + TEST (std::is_base_of, derived_<class_B>, class_B, false); } static void test_is_convertible () @@ -334,9 +340,27 @@ TEST (std::is_convertible, int (), int (&)(char), false); TEST (std::is_convertible, int*, void*, true); - TEST (std::is_convertible, int (*)(), void*, false); + TEST (std::is_convertible, int (*)(), void*, true); - //TEST (std::is_convertible, int (*)(derived_<struct_A>::*), int (*)(struct_A::*), true); + TEST (std::is_convertible, + int (*)(derived_<struct_A>*), + int (*)(struct_A*), false); + + TEST (std::is_convertible, + int (*)(struct_A*), + int (*)(derived_<struct_A>*), false); + + // pointer to derived member convertible to + // pointer to base member + TEST (std::is_convertible, + int derived_<struct_A>::*, + int struct_A::*, false); + + // pointer to base member convertible to + // pointer to derived member + TEST (std::is_convertible, + int struct_A::*, + int derived_<struct_A>::*, true); TEST (std::is_convertible, int, double, true); TEST (std::is_convertible, const int, double, true);