[type_traits] Preliminary patch to work around GCC Bug 8503 and a minor feature request

Hi Boosters/John, GCC Bug 8503 ------------ during the Function Types review there was a report about GCC 3.2 warnings "volatile qualified function" (remove_cv on a function). It seems it's http://gcc.gnu.org/bugzilla/show_bug.cgi?8503. According to the GCC-Bugzilla, John's watching it - probably even the reporter. However, it seems it's currently not addressed by TypeTraits, so I wrote a preliminary patch to work around it (see attached file). Thanks to Jody Hadins for helping tracking it. is_aggregate == "is_class_or_union" ------------------------------------ Not that I currently need it -- but shouldn't there be a public one like this, at least for completeness ? Btw. great new documentation! Regards, Tobias Index: boost/type_traits/detail/cv_traits_impl.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/type_traits/detail/cv_traits_impl.hpp,v retrieving revision 1.3 diff -u -r1.3 cv_traits_impl.hpp --- boost/type_traits/detail/cv_traits_impl.hpp 3 Dec 2003 13:32:56 -0000 1.3 +++ boost/type_traits/detail/cv_traits_impl.hpp 19 Jun 2005 15:06:19 -0000 @@ -12,13 +12,22 @@ #define BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED #include "boost/config.hpp" +#include "boost/detail/workaround.hpp" #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +// implementation helper: + + +#if BOOST_WORKAROUND(__GNUC__,== 3) && BOOST_WORKAROUND(__GNUC_MINOR__,<= 2) +#include "boost/type_traits/detail/yes_no_type.hpp" namespace boost { namespace detail { - -// implementation helper: +namespace type_traits { +#else +namespace boost { +namespace detail { +#endif template <typename T> struct cv_traits_imp {}; @@ -54,6 +63,29 @@ typedef T unqualified_type; }; +#if BOOST_WORKAROUND(__GNUC__,== 3) && BOOST_WORKAROUND(__GNUC_MINOR__, <= 2) +// We have to exclude function pointers +// (see http://gcc.gnu.org/bugzilla/show_bug.cgi?8503) +::boost::type_traits::yes_type mini_funcptr_tester(...); +::boost::type_traits::no_type mini_funcptr_tester(const volatile void*); + +} // namespace type_traits + +// Use the implementation above for non function pointers +template <typename T, unsigned Select + = (unsigned)sizeof(boost::detail::type_traits::mini_funcptr_tester((T)0)) > +struct cv_traits_imp : boost::detail::type_traits::cv_traits_imp<T> { }; + +// Functions are never cv-qualified +template <typename T> struct cv_traits_imp<T*,1> +{ + BOOST_STATIC_CONSTANT(bool, is_const = false); + BOOST_STATIC_CONSTANT(bool, is_volatile = false); + typedef T unqualified_type; +}; + +#endif + } // namespace detail } // namespace boost

Tobias Schwinger wrote:
a preliminary patch to work around it (see attached file).
^^^^^^^^^^^^^^^^^^^^^^^^ Just noticed it doesn't work because it causes name conflicts in some places (I should've run the whole test-suite...). The one attached this time does, however. Sorry! Tobias Index: boost/type_traits/detail/cv_traits_impl.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/type_traits/detail/cv_traits_impl.hpp,v retrieving revision 1.3 diff -u -r1.3 cv_traits_impl.hpp --- boost/type_traits/detail/cv_traits_impl.hpp 3 Dec 2003 13:32:56 -0000 1.3 +++ boost/type_traits/detail/cv_traits_impl.hpp 20 Jun 2005 20:17:04 -0000 @@ -12,13 +12,22 @@ #define BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED #include "boost/config.hpp" +#include "boost/detail/workaround.hpp" #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +// implementation helper: + + +#if !(BOOST_WORKAROUND(__GNUC__,== 3) && (__GNUC_MINOR__ <= 2)) namespace boost { namespace detail { - -// implementation helper: +#else +#include "boost/type_traits/detail/yes_no_type.hpp" +namespace boost { +namespace type_traits { +namespace gcc8503 { +#endif template <typename T> struct cv_traits_imp {}; @@ -54,6 +63,32 @@ typedef T unqualified_type; }; +#if BOOST_WORKAROUND(__GNUC__,== 3) && BOOST_WORKAROUND(__GNUC_MINOR__, <= 2) +// We have to exclude function pointers +// (see http://gcc.gnu.org/bugzilla/show_bug.cgi?8503) +yes_type mini_funcptr_tester(...); +no_type mini_funcptr_tester(const volatile void*); + +} // namespace gcc8503 +} // namespace type_traits + +namespace detail { + +// Use the implementation above for non function pointers +template <typename T, unsigned Select + = (unsigned)sizeof(::boost::type_traits::gcc8503::mini_funcptr_tester((T)0)) > +struct cv_traits_imp : ::boost::type_traits::gcc8503::cv_traits_imp<T> { }; + +// Functions are never cv-qualified +template <typename T> struct cv_traits_imp<T*,1> +{ + BOOST_STATIC_CONSTANT(bool, is_const = false); + BOOST_STATIC_CONSTANT(bool, is_volatile = false); + typedef T unqualified_type; +}; + +#endif + } // namespace detail } // namespace boost

GCC Bug 8503 ------------
during the Function Types review there was a report about GCC 3.2 warnings "volatile qualified function" (remove_cv on a function).
It seems it's http://gcc.gnu.org/bugzilla/show_bug.cgi?8503. According to the GCC-Bugzilla, John's watching it - probably even the reporter. However, it seems it's currently not addressed by TypeTraits, so I wrote a preliminary patch to work around it (see attached file). Thanks to Jody Hadins for helping tracking it.
I don't have a copy of gcc-3.2 set up at present to test with, can this wait until after the release?
is_aggregate == "is_class_or_union" ------------------------------------
Not that I currently need it -- but shouldn't there be a public one like this, at least for completeness ?
Ummm, an aggregate has special meaning in the std, and it's *not* the same as "is_class_or_union"; an aggregate is a type that can be initialised with an initializer list: MyAgg f = { a, b, c, }; There's also no way to implement it as far as I know, not that that's stopped us before mind you ;-) John.

John Maddock wrote:
GCC Bug 8503 ------------
during the Function Types review there was a report about GCC 3.2 warnings "volatile qualified function" (remove_cv on a function).
It seems it's http://gcc.gnu.org/bugzilla/show_bug.cgi?8503. According to the GCC-Bugzilla, John's watching it - probably even the reporter. However, it seems it's currently not addressed by TypeTraits, so I wrote a preliminary patch to work around it (see attached file). Thanks to Jody Hadins for helping tracking it.
I don't have a copy of gcc-3.2 set up at present to test with, can this wait until after the release?
Of course. I just wanted to have it said before I forget. That is, as long as /you/ can live with it (as the cv traits may return wrong results on functions for the affected versions). For 3.2 the test suite passes (using the corrected patch in the follow-up), but __GNUC_MINOR__ < 2 should be tested too.
is_aggregate == "is_class_or_union" ------------------------------------
Not that I currently need it -- but shouldn't there be a public one like this, at least for completeness ?
Ummm, an aggregate has special meaning in the std, and it's *not* the same as "is_class_or_union"; an aggregate is a type that can be initialised with an initializer list:
Just read 8.5.1... Sorry, I was mislead by these GCC diagnostic messages: struct X : my_not_class_not_union ... // "non-aggregate not ok" (or so) struct Y : my_union // "use aggregate but no union" (or so) A "publicly accessible is_class_or_union" would still be a good idea, IMO...
MyAgg f = { a, b, c, };
There's also no way to implement it as far as I know, not that that's stopped us before mind you ;-)
...but 'is_aggregate' a very bad name for it. Regards, Tobias

That is, as long as /you/ can live with it (as the cv traits may return wrong results on functions for the affected versions).
Apparently I couldn't live with it: patch tested and applied. John.
participants (2)
-
John Maddock
-
Tobias Schwinger