Author: vitek
Date: Wed Jul 23 11:39:45 2008
New Revision: 679158
URL: http://svn.apache.org/viewvc?rev=679158&view=rev
Log:
2008-07-23 Travis Vitek <[EMAIL PROTECTED]>
* include/rw/_config-eccp.h: Use built-in __is_empty() trait.
* include/rw/_meta_prop.h: Remove sunpro-5.9 workaround for
__rw_is_const and __rw_is_volatile in favor of one that works
with msvc-8.0 also. Add msvc-8.0 workarounds removed in r678931.
Apply workaround for __is_empty() on eccp-3.10.
* include/rw/_meta_rel.h: Invert logic on __rw_is_base_of_impl
specializations to improve readability. Ensure that cv-qualified
types are considered equal for __is_base_of_impl. Add msvc-8.0
workarounds removed in r678931.
* tests/utilities/20.meta.rel.cpp (test_is_same): Add cv-qual
testing.
(test_is_base_of): Ditto.
(test_is_convertible) [_MSC_VER]: Work around msvc extension
that allows conversion from function pointer to void pointer.
Modified:
stdcxx/branches/4.3.x/include/rw/_config-eccp.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-eccp.h
URL:
http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/include/rw/_config-eccp.h?rev=679158&r1=679157&r2=679158&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/include/rw/_config-eccp.h (original)
+++ stdcxx/branches/4.3.x/include/rw/_config-eccp.h Wed Jul 23 11:39:45 2008
@@ -73,8 +73,7 @@
# define _RWSTD_TT_IS_CLASS(T) __is_class(T)
# define _RWSTD_TT_IS_POD(T) __is_pod(T)
-// __is_empty() fails to detect union types
-//# define _RWSTD_TT_IS_EMPTY(T) __is_empty(T)
+# define _RWSTD_TT_IS_EMPTY(T) __is_empty(T)
# define _RWSTD_TT_IS_POLYMORPHIC(T) __is_polymorphic(T)
// __is_convertible_to() fails for decay and void-void conversions
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=679158&r1=679157&r2=679158&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 23 11:39:45 2008
@@ -44,80 +44,48 @@
template <> struct Trait<Type volatile> : __rw_true_type { }; \
template <> struct Trait<Type const volatile> : __rw_true_type { }
-
-#if defined (__SUNPRO_CC) && (__SUNPRO_CC <= 0x590)
-
template <class _TypeT>
-struct __rw_is_const_impl
+struct __rw_is_const : __rw_false_type
{
- struct _C_no { };
- struct _C_yes { _C_no __pad [2]; };
-
- template <class _TypeU>
- struct _C_nest { };
-
- template <class _TypeU>
- static _C_yes _C_test (_C_nest<const _TypeU>*);
-
- template <class _TypeU>
- static _C_no _C_test (_C_nest<_TypeU>*);
-
- enum { _C_value =
- sizeof (_C_test ((_C_nest<_TypeT>*)0)) == sizeof (_C_yes)
- };
};
template <class _TypeT>
-struct __rw_is_const
- : __rw_integral_constant<bool, __rw_is_const_impl<_TypeT>::_C_value>
+struct __rw_is_const<const _TypeT> : __rw_true_type
{
};
template <class _TypeT>
-struct __rw_is_volatile_impl
+struct __rw_is_volatile : __rw_false_type
{
- struct _C_no { };
- struct _C_yes { _C_no __pad [2]; };
-
- template <class _TypeU>
- struct _C_nest { };
-
- template <class _TypeU>
- static _C_yes _C_test (_C_nest<volatile _TypeU>*);
-
- template <class _TypeU>
- static _C_no _C_test (_C_nest<_TypeU>*);
-
- enum { _C_value =
- sizeof (_C_test ((_C_nest<_TypeT>*)0)) == sizeof (_C_yes)
- };
};
template <class _TypeT>
-struct __rw_is_volatile
- : __rw_integral_constant<bool, __rw_is_volatile_impl<_TypeT>::_C_value>
+struct __rw_is_volatile<volatile _TypeT> : __rw_true_type
{
};
-#else
+#if defined (__SUNPRO_CC) && (__SUNPRO_CC <= 0x590) \
+ || defined (_MSC_VER) && (_MSC_VER <= 1400)
+
+// additional specializations needed for these compilers
template <class _TypeT>
-struct __rw_is_const : __rw_false_type
+struct __rw_is_const<const _TypeT []> : __rw_true_type
{
};
-template <class _TypeT>
-struct __rw_is_const<const _TypeT> : __rw_true_type
+template <class _TypeT, _RWSTD_SIZE_T _Size>
+struct __rw_is_const<const _TypeT [_Size]> : __rw_true_type
{
};
template <class _TypeT>
-struct __rw_is_volatile : __rw_false_type
+struct __rw_is_volatile<volatile _TypeT []> : __rw_true_type
{
};
-template <class _TypeT>
-struct __rw_is_volatile<volatile _TypeT> : __rw_true_type
+template <class _TypeT, _RWSTD_SIZE_T _Size>
+struct __rw_is_volatile<volatile _TypeT [_Size]> : __rw_true_type
{
};
@@ -140,7 +108,7 @@
# define _RWSTD_IS_POD(T) _RW::__rw_is_pod_impl<T>::_C_value
-#elif defined (__EDG_VERSION__)
+#elif defined (__EDG_VERSION__) || defined (_MSC_VER)
template <class _TypeT>
struct __rw_is_pod_impl
@@ -181,7 +149,14 @@
#if defined (_RWSTD_TT_IS_EMPTY)
-# define _RWSTD_IS_EMPTY(T) _RWSTD_TT_IS_EMPTY(T)
+
+# if defined (__EDG_VERSION__) || defined (_MSC_VER)
+# define _RWSTD_IS_EMPTY(T) \
+ (_RWSTD_TT_IS_EMPTY(T) && !_RW::__rw_is_union<T>::value)
+# else
+# define _RWSTD_IS_EMPTY(T) _RWSTD_TT_IS_EMPTY(T)
+# endif
+
#elif defined (_RWSTD_TT_IS_CLASS) || defined (_RWSTD_TT_IS_UNION)
//
@@ -212,7 +187,7 @@
# define _RWSTD_IS_EMPTY(T) _RW::__rw_is_empty_impl<T>::_C_value
#else
- // we have no reliable way to reliably tell if the type is empty,
+ // we have no reliable way to tell if the type is empty,
// so we assume that it is not.
# define _RWSTD_IS_EMPTY(T) 0
#endif // !_RWSTD_TT_IS_EMPTY
@@ -328,7 +303,7 @@
#if !defined (_RWSTD_TT_HAS_TRIVIAL_CTOR)
# define _RWSTD_HAS_TRIVIAL_CTOR(T) _RW::__rw_is_pod<T>::value
-#elif defined (__EDG_VERSION__)
+#elif defined (__EDG_VERSION__) || defined (_MSC_VER)
template <class _TypeT>
struct __rw_has_trivial_ctor_impl
@@ -359,7 +334,7 @@
( !_RW::__rw_is_array<T>::value \
&& ( _RW::__rw_is_reference<T>::value \
|| _RW::__rw_is_pod<T>::value))
-#elif defined (__EDG_VERSION__)
+#elif defined (__EDG_VERSION__) || defined (_MSC_VER)
# define _RWSTD_HAS_TRIVIAL_COPY(T) \
( _RW::__rw_is_reference<T>::value \
|| _RW::__rw_is_scalar<T>::value \
@@ -393,6 +368,10 @@
#elif defined (__GNUG__)
# define _RWSTD_HAS_TRIVIAL_ASSIGN(T) \
(!_RW::__rw_is_array<T>::value && _RWSTD_TT_HAS_TRIVIAL_ASSIGN(T))
+#elif defined (_MSC_VER)
+# define _RWSTD_HAS_TRIVIAL_ASSIGN(T) \
+ (!_RW::__rw_is_const<T>::value \
+ && (_RW::__rw_is_scalar<T>::value || _RWSTD_TT_HAS_TRIVIAL_ASSIGN(T)))
#else
# define _RWSTD_HAS_TRIVIAL_ASSIGN(T) _RWSTD_TT_HAS_TRIVIAL_ASSIGN(T)
#endif // _RWSTD_TT_HAS_TRIVIAL_ASSIGN
@@ -412,7 +391,7 @@
# define _RWSTD_HAS_TRIVIAL_DTOR(T) \
( _RW::__rw_is_reference<_TypeT>::value \
|| _RWSTD_TT_HAS_TRIVIAL_DTOR (_TypeT))
-#elif defined (__EDG_VERSION__)
+#elif defined (__EDG_VERSION__) || defined (_MSC_VER)
template <class _TypeT>
struct __rw_has_trivial_dtor_impl
@@ -466,7 +445,7 @@
#if !defined (_RWSTD_TT_HAS_NOTHROW_CTOR)
# define _RWSTD_HAS_NOTHROW_CTOR(T) _RW::__rw_has_trivial_ctor<T>::value
-#elif defined (__EDG_VERSION__)
+#elif defined (__EDG_VERSION__) || defined (_MSC_VER)
template <class _TypeT>
struct __rw_has_nothrow_ctor_impl
@@ -493,7 +472,7 @@
#if !defined (_RWSTD_TT_HAS_NOTHROW_COPY)
# define _RWSTD_HAS_NOTHROW_COPY(T) _RW::__rw_has_trivial_copy<T>::value
-#elif defined (__EDG_VERSION__)
+#elif defined (__EDG_VERSION__) || defined (_MSC_VER)
# define _RWSTD_HAS_NOTHROW_COPY(T) \
(_RW::__rw_has_trivial_copy<T>::value || _RWSTD_TT_HAS_NOTHROW_COPY(T))
#elif defined (__GNUG__)
@@ -512,15 +491,23 @@
#if !defined (_RWSTD_TT_HAS_NOTHROW_ASSIGN)
-# define _RWSTD_HAS_NOTHROW_ASSIGN(T) _RW::__rw_has_trivial_assign<T>::value
+# define _RWSTD_HAS_NOTHROW_ASSIGN(T) \
+ _RW::__rw_has_trivial_assign<T>::value
#elif defined (__EDG_VERSION__)
# define _RWSTD_HAS_NOTHROW_ASSIGN(T) \
(!_RW::__rw_is_const<T>::value \
&& !_RW::__rw_is_reference<T>::value \
- && (_RW::__rw_has_trivial_assign<T>::value ||
_RWSTD_TT_HAS_NOTHROW_ASSIGN(T)))
+ && ( _RW::__rw_has_trivial_assign<T>::value \
+ || _RWSTD_TT_HAS_NOTHROW_ASSIGN(T)))
#elif defined (__GNUG__)
# define _RWSTD_HAS_NOTHROW_ASSIGN(T) \
- (!_RW::__rw_is_array<T>::value && _RWSTD_TT_HAS_NOTHROW_ASSIGN(T))
+ ( !_RW::__rw_is_array<T>::value \
+ && _RWSTD_TT_HAS_NOTHROW_ASSIGN(T))
+#elif defined (_MSC_VER)
+# define _RWSTD_HAS_NOTHROW_ASSIGN(T) \
+ (!_RW::__rw_is_const<T>::value \
+ && ( _RW::__rw_has_trivial_assign<T>::value \
+ || _RWSTD_TT_HAS_NOTHROW_ASSIGN(T)))
#else
# define _RWSTD_HAS_NOTHROW_ASSIGN(T) _RWSTD_TT_HAS_NOTHROW_ASSIGN(T)
#endif // !_RWSTD_TT_HAS_NOTHROW_ASSIGN
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=679158&r1=679157&r2=679158&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 23 11:39:45 2008
@@ -67,8 +67,8 @@
// is not a class type.
//
template <class _Base, class _Derived,
- bool = !__rw_is_class<_Base>::value
- || !__rw_is_class<_Derived>::value>
+ bool = __rw_is_class<_Base>::value
+ && __rw_is_class<_Derived>::value>
struct __rw_is_base_of_impl
{
enum { _C_value = 0 };
@@ -82,7 +82,7 @@
// by Rani Sharoni [see http://tinyurl.com/6pdv3k]
//
template <class _Base, class _Derived>
-struct __rw_is_base_of_impl<_Base, _Derived, false>
+struct __rw_is_base_of_impl<_Base, _Derived, true>
{
struct _C_no { };
struct _C_yes { _C_no __pad [2]; };
@@ -101,7 +101,9 @@
};
enum { _C_value =
- sizeof (_C_yes) == sizeof (_C_nest::_C_is (_C_nest (), 0))
+ _RW::__rw_is_same<const volatile _Base,
+ const volatile _Derived&>::value
+ || sizeof (_C_yes) == sizeof (_C_nest::_C_is (_C_nest (), 0))
};
};
@@ -110,7 +112,7 @@
// _Derived are the same class type.
//
template <class _TypeT>
-struct __rw_is_base_of_impl<_TypeT, _TypeT, false>
+struct __rw_is_base_of_impl<_TypeT, _TypeT, true>
{
enum { _C_value = 1 };
};
@@ -118,6 +120,11 @@
# define _RWSTD_IS_BASE_OF(T,U) \
_RW::__rw_is_base_of_impl<T,U>::_C_value
+#elif defined (_MSC_VER)
+# define _RWSTD_IS_BASE_OF(T,U) \
+ ( _RW::__rw_is_class<T>::value \
+ && _RW::__rw_is_class<U>::value \
+ && _RWSTD_TT_IS_BASE_OF(T,U))
#else
# define _RWSTD_IS_BASE_OF(T,U) _RWSTD_TT_IS_BASE_OF(T,U)
#endif // _RWSTD_TT_IS_BASE_OF
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=679158&r1=679157&r2=679158&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 23 11:39:45
2008
@@ -151,6 +151,15 @@
TEST (std::is_same, signed long, unsigned long, false);
TEST (std::is_same, unsigned long, signed long, false);
+ TEST (std::is_same, long, const long, false);
+ TEST (std::is_same, const long, long, false);
+
+ TEST (std::is_same, long, volatile long, false);
+ TEST (std::is_same, volatile long, long, false);
+
+ TEST (std::is_same, long, const volatile long, false);
+ TEST (std::is_same, const volatile long, long, false);
+
TEST (std::is_same, enum_A, char, false);
TEST (std::is_same, enum_A, short, false);
TEST (std::is_same, enum_A, int, false);
@@ -225,6 +234,21 @@
TEST (std::is_base_of, struct_A, derived_private_t<struct_A>, true);
#endif
+ // cv-qualified
+ TEST (std::is_base_of, const struct_A, struct_A, true);
+ TEST (std::is_base_of, struct_A, const struct_A, true);
+ TEST (std::is_base_of, volatile struct_A, struct_A, true);
+ TEST (std::is_base_of, struct_A, volatile struct_A, true);
+ TEST (std::is_base_of, const volatile struct_A, struct_A, true);
+ TEST (std::is_base_of, struct_A, const volatile struct_A, true);
+
+ TEST (std::is_base_of, const struct_A, derived_t<struct_A>, true);
+ TEST (std::is_base_of, struct_A, const derived_t<struct_A>, true);
+ TEST (std::is_base_of, volatile struct_A, derived_t<struct_A>, true);
+ TEST (std::is_base_of, struct_A, volatile derived_t<struct_A>, true);
+ TEST (std::is_base_of, const volatile struct_A, derived_t<struct_A>, true);
+ TEST (std::is_base_of, struct_A, const volatile derived_t<struct_A>, true);
+
// other combinations should fail
TEST (std::is_base_of, signed char, char, false);
TEST (std::is_base_of, char, signed char, false);
@@ -367,7 +391,14 @@
TEST (std::is_convertible, int (), int (&)(char), false);
TEST (std::is_convertible, int*, void*, true);
+
+#ifdef _MSC_VER
+ // microsoft language extension allows this conversion, and that
+ // extension is enabled by default.
+ TEST (std::is_convertible, int (*)(), void*, true);
+#else
TEST (std::is_convertible, int (*)(), void*, false);
+#endif
TEST (std::is_convertible,
int (*)(derived_t<struct_A>*),