From: paolo Date: Wed, 6 Oct 2010 17:17:16 +0000 (+0000) Subject: 2010-10-06 Paolo Carlini X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=835e1464c1ebe3b70b1546928c2c51fb64f51ab6 2010-10-06 Paolo Carlini * include/std/functional (struct _Weak_result_type_impl): Add specializazions for cv-qualified function types, for variadic function types and pointers and references to function types, and for pointers to member function types. (struct _Reference_wrapper_base): Add specializations for cv-qualified unary and binary function types. * testsuite/20_util/reference_wrapper/result_type.cc: New. * testsuite/20_util/reference_wrapper/typedefs-2.cc: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@165056 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 0f3c8535285..bd06501440c 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2010-10-06 Paolo Carlini + + * include/std/functional (struct _Weak_result_type_impl): Add + specializazions for cv-qualified function types, for variadic + function types and pointers and references to function types, + and for pointers to member function types. + (struct _Reference_wrapper_base): Add specializations for + cv-qualified unary and binary function types. + * testsuite/20_util/reference_wrapper/result_type.cc: New. + * testsuite/20_util/reference_wrapper/typedefs-2.cc: Likewise. + 2010-10-06 Rainer Orth PR libstdc++/45863 diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index f781d9e0477..33fe07284ac 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -60,9 +60,6 @@ namespace std { - template - class _Mem_fn; - _GLIBCXX_HAS_NESTED_TYPE(result_type) /// If we have found a result_type, extract it. @@ -72,9 +69,7 @@ _GLIBCXX_HAS_NESTED_TYPE(result_type) template struct _Maybe_get_result_type - { - typedef typename _Functor::result_type result_type; - }; + { typedef typename _Functor::result_type result_type; }; /** * Base class for any function object that has a weak result type, as @@ -88,51 +83,91 @@ _GLIBCXX_HAS_NESTED_TYPE(result_type) /// Retrieve the result type for a function type. template struct _Weak_result_type_impl<_Res(_ArgTypes...)> - { - typedef _Res result_type; - }; + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes......)> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes...) const> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes......) const> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes...) volatile> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes......) volatile> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes...) const volatile> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes......) const volatile> + { typedef _Res result_type; }; /// Retrieve the result type for a function reference. template struct _Weak_result_type_impl<_Res(&)(_ArgTypes...)> - { - typedef _Res result_type; - }; + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(&)(_ArgTypes......)> + { typedef _Res result_type; }; /// Retrieve the result type for a function pointer. template struct _Weak_result_type_impl<_Res(*)(_ArgTypes...)> - { - typedef _Res result_type; - }; + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(*)(_ArgTypes......)> + { typedef _Res result_type; }; /// Retrieve result type for a member function pointer. template struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)> - { - typedef _Res result_type; - }; + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......)> + { typedef _Res result_type; }; /// Retrieve result type for a const member function pointer. template struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) const> - { - typedef _Res result_type; - }; + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......) const> + { typedef _Res result_type; }; /// Retrieve result type for a volatile member function pointer. template struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) volatile> - { - typedef _Res result_type; - }; + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......) volatile> + { typedef _Res result_type; }; /// Retrieve result type for a const volatile member function pointer. template - struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)const volatile> - { - typedef _Res result_type; - }; + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) + const volatile> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......) + const volatile> + { typedef _Res result_type; }; /** * Strip top-level cv-qualifiers from the function object and let @@ -280,12 +315,42 @@ _GLIBCXX_HAS_NESTED_TYPE(result_type) : unary_function<_T1, _Res> { }; + template + struct _Reference_wrapper_base<_Res(_T1) const> + : unary_function<_T1, _Res> + { }; + + template + struct _Reference_wrapper_base<_Res(_T1) volatile> + : unary_function<_T1, _Res> + { }; + + template + struct _Reference_wrapper_base<_Res(_T1) const volatile> + : unary_function<_T1, _Res> + { }; + // - a function type (binary) template struct _Reference_wrapper_base<_Res(_T1, _T2)> : binary_function<_T1, _T2, _Res> { }; + template + struct _Reference_wrapper_base<_Res(_T1, _T2) const> + : binary_function<_T1, _T2, _Res> + { }; + + template + struct _Reference_wrapper_base<_Res(_T1, _T2) volatile> + : binary_function<_T1, _T2, _Res> + { }; + + template + struct _Reference_wrapper_base<_Res(_T1, _T2) const volatile> + : binary_function<_T1, _T2, _Res> + { }; + // - a function pointer type (unary) template struct _Reference_wrapper_base<_Res(*)(_T1)> @@ -423,17 +488,8 @@ _GLIBCXX_HAS_NESTED_TYPE(result_type) // @} group functors - template - struct _Mem_fn_const_or_non - { - typedef const _Tp& type; - }; - - template - struct _Mem_fn_const_or_non<_Tp, false> - { - typedef _Tp& type; - }; + template + class _Mem_fn; /** * Derives from @c unary_function or @c binary_function, or perhaps @@ -639,6 +695,18 @@ _GLIBCXX_HAS_NESTED_TYPE(result_type) }; + template + struct _Mem_fn_const_or_non + { + typedef const _Tp& type; + }; + + template + struct _Mem_fn_const_or_non<_Tp, false> + { + typedef _Tp& type; + }; + template class _Mem_fn<_Res _Class::*> { diff --git a/libstdc++-v3/testsuite/20_util/reference_wrapper/result_type.cc b/libstdc++-v3/testsuite/20_util/reference_wrapper/result_type.cc new file mode 100644 index 00000000000..911e9a944ad --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/reference_wrapper/result_type.cc @@ -0,0 +1,42 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// 2010-10-06 Paolo Carlini + +// Copyright (C) 2010 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include + +using namespace std; + +struct T; + +reference_wrapper::result_type i01; +reference_wrapper::result_type i02; +reference_wrapper::result_type i03; +reference_wrapper::result_type i04; + +reference_wrapper::result_type i05; +reference_wrapper::result_type i06; +reference_wrapper::result_type i07; +reference_wrapper::result_type i08; + +reference_wrapper::result_type i09; +reference_wrapper::result_type i10; +reference_wrapper::result_type i11; +reference_wrapper::result_type i12; diff --git a/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-2.cc b/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-2.cc new file mode 100644 index 00000000000..8b1b7e3f14e --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-2.cc @@ -0,0 +1,69 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// 2010-10-06 Paolo Carlini + +// Copyright (C) 2010 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include + +using namespace std; + +reference_wrapper::argument_type i01; +reference_wrapper::argument_type i02; +reference_wrapper::argument_type i03; +reference_wrapper::argument_type i04; +reference_wrapper::result_type i05; +reference_wrapper::result_type i06; +reference_wrapper::result_type i07; +reference_wrapper::result_type i08; + +reference_wrapper::argument_type i09; +reference_wrapper::argument_type i10; +reference_wrapper::argument_type i11; +reference_wrapper::argument_type i12; +reference_wrapper::result_type i13; +reference_wrapper::result_type i14; +reference_wrapper::result_type i15; +reference_wrapper::result_type i16; + +reference_wrapper::first_argument_type i17; +reference_wrapper::first_argument_type i18; +reference_wrapper::first_argument_type i19; +reference_wrapper::first_argument_type i20; +reference_wrapper::second_argument_type i21; +reference_wrapper::second_argument_type i22; +reference_wrapper::second_argument_type i23; +reference_wrapper::second_argument_type i24; +reference_wrapper::result_type i25; +reference_wrapper::result_type i26; +reference_wrapper::result_type i27; +reference_wrapper::result_type i28; + +reference_wrapper::first_argument_type i29; +reference_wrapper::first_argument_type i30; +reference_wrapper::first_argument_type i31; +reference_wrapper::first_argument_type i32; +reference_wrapper::second_argument_type i33; +reference_wrapper::second_argument_type i34; +reference_wrapper::second_argument_type i35; +reference_wrapper::second_argument_type i36; +reference_wrapper::result_type i37; +reference_wrapper::result_type i38; +reference_wrapper::result_type i39; +reference_wrapper::result_type i40;