From patchwork Sun Apr 7 10:46:55 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Fran=C3=A7ois_Dumont?= X-Patchwork-Id: 234474 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 039902C0082 for ; Sun, 7 Apr 2013 20:47:51 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:references :in-reply-to:content-type; q=dns; s=default; b=CxFP75RgAd2iowMoG FdV0VO/U5R8/RmT20mL3flKGhrPwmjA8HzWCkk5kZ4l/wph6hY26vY4FG72AN9yF mbl7JkrFtfdxX4d2tpt1OxBGogLo08LH8s3PRBg8F6Ysvrodf/uwgFmGxToSudDL GsEH1RB5wWmeimlEjDtUIzUtYQ= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:references :in-reply-to:content-type; s=default; bh=ALuRuGh5uCnRGQE16BRebbG wJpk=; b=Y1skU2Xl1me37lfER12KdikquT2shmOJHJgSiqqtyUHFFxmPyKrdGmI yEqusCks7ypahfQuuzqSnj7LgoMW+ZchlCPOwwY6O1l/GNis70fvZubwqDkM8LSJ L9DQA9kFRwjoNyeMKkXh0ELxGhs26WfHEfNkm6bVgYc2ppWEqFAU= Received: (qmail 8262 invoked by alias); 7 Apr 2013 10:47:05 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 8207 invoked by uid 89); 7 Apr 2013 10:47:04 -0000 X-Spam-SWARE-Status: No, score=-5.2 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, KHOP_RCVD_TRUST, KHOP_THREADED, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE autolearn=ham version=3.3.1 X-Spam-User: qpsmtpd, 2 recipients Received: from mail-wi0-f176.google.com (HELO mail-wi0-f176.google.com) (209.85.212.176) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Sun, 07 Apr 2013 10:47:00 +0000 Received: by mail-wi0-f176.google.com with SMTP id hm14so1753312wib.9 for ; Sun, 07 Apr 2013 03:46:58 -0700 (PDT) X-Received: by 10.194.237.40 with SMTP id uz8mr25887156wjc.49.1365331618162; Sun, 07 Apr 2013 03:46:58 -0700 (PDT) Received: from localhost.localdomain (arf62-1-82-237-250-248.fbx.proxad.net. [82.237.250.248]) by mx.google.com with ESMTPS id t7sm13461627wij.2.2013.04.07.03.46.55 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 07 Apr 2013 03:46:56 -0700 (PDT) Message-ID: <51614E9F.1070108@gmail.com> Date: Sun, 07 Apr 2013 12:46:55 +0200 From: =?ISO-8859-1?Q?Fran=E7ois_Dumont?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120829 Thunderbird/15.0 MIME-Version: 1.0 To: Jonathan Wakely CC: =?ISO-8859-1?Q?Daniel_Kr=FCgler?= , "libstdc++@gcc.gnu.org" , gcc-patches Subject: Re: functional and type_traits cleanup References: <515DDF9F.1050809@gmail.com> <515F3049.5060403@gmail.com> In-Reply-To: X-Virus-Found: No On 04/06/2013 10:43 PM, Jonathan Wakely wrote: > That wouldn't hurt, but I agree it shouldn't prevent the patch going > in. François, please go ahead and commit it, thanks. Attached patch applied then. Not exactly the one submitted the 2nd time because I hadn't fix dg-error line numbers at that time. 2013-04-07 François Dumont * include/std/functional (_Derives_from_unary_function): Remove. (_Derives_from_binary_function): Remove. * include/std/type_traits (__sfinae_types): Remove. (__is_assignable_helper): Adapt. (__is_convertible_helper): Adapt. (_GLIBCXX_HAS_NESTED_TYPE): Adapt. Remove several explicit instantiations of integral_constant. * testsuite/20_util/reference_wrapper/typedefs-3.cc: Adapt. * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Adapt dg-error line number. * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Likewise. * testsuite/20_util/declval/requirements/1_neg.cc: Likewise. * testsuite/20_util/bind/ref_neg.cc: Likewise. François Index: include/std/functional =================================================================== --- include/std/functional (revision 197550) +++ include/std/functional (working copy) @@ -185,38 +185,6 @@ : _Weak_result_type_impl::type> { }; - /// Determines if the type _Tp derives from unary_function. - template - struct _Derives_from_unary_function : __sfinae_types - { - private: - template - static __one __test(const volatile unary_function<_T1, _Res>*); - - // It's tempting to change "..." to const volatile void*, but - // that fails when _Tp is a function type. - static __two __test(...); - - public: - static const bool value = sizeof(__test((_Tp*)0)) == 1; - }; - - /// Determines if the type _Tp derives from binary_function. - template - struct _Derives_from_binary_function : __sfinae_types - { - private: - template - static __one __test(const volatile binary_function<_T1, _T2, _Res>*); - - // It's tempting to change "..." to const volatile void*, but - // that fails when _Tp is a function type. - static __two __test(...); - - public: - static const bool value = sizeof(__test((_Tp*)0)) == 1; - }; - /** * Invoke a function object, which may be either a member pointer or a * function object. The first parameter will tell which. Index: include/std/type_traits =================================================================== --- include/std/type_traits (revision 197550) +++ include/std/type_traits (working copy) @@ -127,12 +127,6 @@ : public integral_constant { }; - struct __sfinae_types - { - typedef char __one; - typedef struct { char __arr[2]; } __two; - }; - // For several sfinae-friendly trait implementations we transport both the // result information (as the member type) and the failure information (no // member type). This is very similar to std::enable_if, but we cannot use @@ -161,8 +155,7 @@ /// is_void template struct is_void - : public integral_constant::type>::value)> + : public __is_void_helper::type>::type { }; template @@ -244,8 +237,7 @@ /// is_integral template struct is_integral - : public integral_constant::type>::value)> + : public __is_integral_helper::type>::type { }; template @@ -273,8 +265,7 @@ /// is_floating_point template struct is_floating_point - : public integral_constant::type>::value)> + : public __is_floating_point_helper::type>::type { }; /// is_array @@ -301,8 +292,7 @@ /// is_pointer template struct is_pointer - : public integral_constant::type>::value)> + : public __is_pointer_helper::type>::type { }; /// is_lvalue_reference @@ -337,8 +327,8 @@ /// is_member_object_pointer template struct is_member_object_pointer - : public integral_constant::type>::value)> + : public __is_member_object_pointer_helper< + typename remove_cv<_Tp>::type>::type { }; template @@ -352,8 +342,8 @@ /// is_member_function_pointer template struct is_member_function_pointer - : public integral_constant::type>::value)> + : public __is_member_function_pointer_helper< + typename remove_cv<_Tp>::type>::type { }; /// is_enum @@ -422,8 +412,7 @@ // __is_nullptr_t (extension). template struct __is_nullptr_t - : public integral_constant::type>::value)> + : public __is_nullptr_t_helper::type>::type { }; // Composite type categories. @@ -480,8 +469,7 @@ /// is_member_pointer template struct is_member_pointer - : public integral_constant::type>::value)> + : public __is_member_pointer_helper::type>::type { }; // Type properties. @@ -567,7 +555,7 @@ /// is_signed template struct is_signed - : public integral_constant::value> + : public __is_signed_helper<_Tp>::type { }; /// is_unsigned @@ -650,7 +638,7 @@ /// is_destructible template struct is_destructible - : public integral_constant::value)> + : public __is_destructible_safe<_Tp>::type { }; // is_nothrow_destructible requires that is_destructible is @@ -698,7 +686,7 @@ /// is_nothrow_destructible template struct is_nothrow_destructible - : public integral_constant::value)> + : public __is_nt_destructible_safe<_Tp>::type { }; struct __do_is_default_constructible_impl @@ -746,8 +734,7 @@ /// is_default_constructible template struct is_default_constructible - : public integral_constant::value)> + : public __is_default_constructible_safe<_Tp>::type { }; @@ -901,8 +888,7 @@ template struct __is_direct_constructible - : public integral_constant::value)> + : public __is_direct_constructible_new<_Tp, _Arg>::type { }; // Since default-construction and binary direct-initialization have @@ -953,8 +939,7 @@ /// is_constructible template struct is_constructible - : public integral_constant::value)> + : public __is_constructible_impl<_Tp, _Args...>::type { }; template::value> @@ -1081,24 +1066,24 @@ template class __is_assignable_helper - : public __sfinae_types { - template - static decltype(declval<_Tp1>() = declval<_Up1>(), __one()) + template() = declval<_Up1>())> + static true_type __test(int); template - static __two __test(...); + static false_type + __test(...); public: - static constexpr bool value = sizeof(__test<_Tp, _Up>(0)) == 1; + typedef decltype(__test<_Tp, _Up>(0)) type; }; /// is_assignable template struct is_assignable - : public integral_constant::value> + : public __is_assignable_helper<_Tp, _Up>::type { }; template::value> @@ -1292,31 +1277,32 @@ bool = __or_, is_function<_To>, is_array<_To>>::value> struct __is_convertible_helper - { static constexpr bool value = is_void<_To>::value; }; + { typedef typename is_void<_To>::type type; }; template class __is_convertible_helper<_From, _To, false> - : public __sfinae_types { - template - static void __test_aux(_To1); + template + static void __test_aux(_To1); - template - static decltype(__test_aux<_To1>(std::declval<_From1>()), __one()) + template(std::declval<_From1>()))> + static true_type __test(int); template - static __two __test(...); + static false_type + __test(...); public: - static constexpr bool value = sizeof(__test<_From, _To>(0)) == 1; + typedef decltype(__test<_From, _To>(0)) type; }; + /// is_convertible template struct is_convertible - : public integral_constant::value> + : public __is_convertible_helper<_From, _To>::type { }; @@ -2041,29 +2027,28 @@ * Use SFINAE to determine if the type _Tp has a publicly-accessible * member type _NTYPE. */ -#define _GLIBCXX_HAS_NESTED_TYPE(_NTYPE) \ - template \ - class __has_##_NTYPE##_helper \ - : __sfinae_types \ - { \ - template \ - struct _Wrap_type \ - { }; \ - \ - template \ - static __one __test(_Wrap_type*); \ - \ - template \ - static __two __test(...); \ - \ - public: \ - static constexpr bool value = sizeof(__test<_Tp>(0)) == 1; \ - }; \ - \ - template \ - struct __has_##_NTYPE \ - : integral_constant::type>::value> \ +#define _GLIBCXX_HAS_NESTED_TYPE(_NTYPE) \ + template \ + class __has_##_NTYPE##_helper \ + { \ + template \ + struct _Wrap_type \ + { }; \ + \ + template \ + static true_type __test(_Wrap_type*); \ + \ + template \ + static false_type __test(...); \ + \ + public: \ + typedef decltype(__test<_Tp>(0)) type; \ + }; \ + \ + template \ + struct __has_##_NTYPE \ + : public __has_##_NTYPE##_helper \ + ::type>::type \ { }; _GLIBCXX_END_NAMESPACE_VERSION Index: testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc =================================================================== --- testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc (revision 197550) +++ testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc (working copy) @@ -48,5 +48,5 @@ // { dg-error "required from here" "" { target *-*-* } 40 } // { dg-error "required from here" "" { target *-*-* } 42 } -// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1531 } -// { dg-error "declaration of" "" { target *-*-* } 1495 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1517 } +// { dg-error "declaration of" "" { target *-*-* } 1481 } Index: testsuite/20_util/bind/ref_neg.cc =================================================================== --- testsuite/20_util/bind/ref_neg.cc (revision 197550) +++ testsuite/20_util/bind/ref_neg.cc (working copy) @@ -30,10 +30,10 @@ { const int dummy = 0; std::bind(&inc, _1)(0); // { dg-error "no match" } - // { dg-error "rvalue|const" "" { target *-*-* } 1347 } - // { dg-error "rvalue|const" "" { target *-*-* } 1361 } - // { dg-error "rvalue|const" "" { target *-*-* } 1375 } - // { dg-error "rvalue|const" "" { target *-*-* } 1389 } + // { dg-error "rvalue|const" "" { target *-*-* } 1315 } + // { dg-error "rvalue|const" "" { target *-*-* } 1329 } + // { dg-error "rvalue|const" "" { target *-*-* } 1343 } + // { dg-error "rvalue|const" "" { target *-*-* } 1357 } std::bind(&inc, std::ref(dummy))(); // { dg-error "no match" } } Index: testsuite/20_util/make_signed/requirements/typedefs_neg.cc =================================================================== --- testsuite/20_util/make_signed/requirements/typedefs_neg.cc (revision 197550) +++ testsuite/20_util/make_signed/requirements/typedefs_neg.cc (working copy) @@ -48,5 +48,5 @@ // { dg-error "required from here" "" { target *-*-* } 40 } // { dg-error "required from here" "" { target *-*-* } 42 } -// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1613 } -// { dg-error "declaration of" "" { target *-*-* } 1577 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1599 } +// { dg-error "declaration of" "" { target *-*-* } 1563 } Index: testsuite/20_util/declval/requirements/1_neg.cc =================================================================== --- testsuite/20_util/declval/requirements/1_neg.cc (revision 197550) +++ testsuite/20_util/declval/requirements/1_neg.cc (working copy) @@ -19,7 +19,7 @@ // with this library; see the file COPYING3. If not see // . -// { dg-error "static assertion failed" "" { target *-*-* } 1871 } +// { dg-error "static assertion failed" "" { target *-*-* } 1857 } #include Index: testsuite/20_util/reference_wrapper/typedefs-3.cc =================================================================== --- testsuite/20_util/reference_wrapper/typedefs-3.cc (revision 197550) +++ testsuite/20_util/reference_wrapper/typedefs-3.cc (working copy) @@ -44,7 +44,8 @@ struct S012 : S0, S1, S2 { }; -using std::__sfinae_types; +using std::true_type; +using std::false_type; using std::integral_constant; using std::remove_cv;