From bff619dcff0717c2251205c44941c31dce40d9de Mon Sep 17 00:00:00 2001 From: redi Date: Tue, 27 Mar 2012 09:03:10 +0000 Subject: [PATCH] * include/std/type_traits (result_of): Fix handling of cv-quals. * testsuite/20_util/result_of/1.cc: New. * testsuite/20_util/result_of/2.cc: New. * testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error line numbers. * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Likewise. * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@185845 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 12 +++++ libstdc++-v3/include/std/type_traits | 24 ++++------ .../20_util/declval/requirements/1_neg.cc | 2 +- .../make_signed/requirements/typedefs_neg.cc | 4 +- .../make_unsigned/requirements/typedefs_neg.cc | 4 +- libstdc++-v3/testsuite/20_util/result_of/1.cc | 53 ++++++++++++++++++++++ libstdc++-v3/testsuite/20_util/result_of/2.cc | 47 +++++++++++++++++++ 7 files changed, 127 insertions(+), 19 deletions(-) create mode 100644 libstdc++-v3/testsuite/20_util/result_of/1.cc create mode 100644 libstdc++-v3/testsuite/20_util/result_of/2.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index da949620f19..1020c19f0be 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,15 @@ +2012-03-27 Jonathan Wakely + + * include/std/type_traits (result_of): Fix handling of cv-quals. + * testsuite/20_util/result_of/1.cc: New. + * testsuite/20_util/result_of/2.cc: New. + * testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error + line numbers. + * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: + Likewise. + * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: + Likewise. + 2012-03-23 David S. Miller * config/abi/post/sparc-linux-gnu/baseline_symbols.txt: Update. diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index e3ec7ad5de5..41022630837 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -1,6 +1,7 @@ // C++11 type_traits -*- C++ -*- -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 +// 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 @@ -1794,6 +1795,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template static _Tp _S_get(const _Class&); template + static _Tp _S_get(const volatile _Class&); + template static decltype(*std::declval<_Tp>()) _S_get(...); public: @@ -1814,6 +1817,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template static _Tp _S_get(const _Class&); template + static _Tp _S_get(const volatile _Class&); + template static decltype(*std::declval<_Tp>()) _S_get(...); public: @@ -1836,22 +1841,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template struct _Result_of_impl - : _Result_of_memobj::type, _Arg> - { - typedef typename _Result_of_memobj< - typename remove_reference<_MemPtr>::type, _Arg>::__type - __type; - }; + : _Result_of_memobj::type, _Arg> + { }; template struct _Result_of_impl - : _Result_of_memfun::type, _Arg, - _ArgTypes...> - { - typedef typename _Result_of_memfun< - typename remove_reference<_MemPtr>::type, _Arg, _ArgTypes...>::__type - __type; - }; + : _Result_of_memfun::type, _Arg, _ArgTypes...> + { }; template struct result_of<_Functor(_ArgTypes...)> diff --git a/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc b/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc index 298e93e23d9..eafbe5f6666 100644 --- a/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc +++ b/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc @@ -19,7 +19,7 @@ // with this library; see the file COPYING3. If not see // . -// { dg-error "static assertion failed" "" { target *-*-* } 1776 } +// { dg-error "static assertion failed" "" { target *-*-* } 1777 } #include diff --git a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc index d2ebf165319..6358d72c4a5 100644 --- a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc +++ b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc @@ -48,5 +48,5 @@ void test01() // { dg-error "required from here" "" { target *-*-* } 40 } // { dg-error "required from here" "" { target *-*-* } 42 } -// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1565 } -// { dg-error "declaration of" "" { target *-*-* } 1529 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1566 } +// { dg-error "declaration of" "" { target *-*-* } 1530 } diff --git a/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc b/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc index c0ef55bd25f..d9a0f178f6c 100644 --- a/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc +++ b/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc @@ -48,5 +48,5 @@ void test01() // { dg-error "required from here" "" { target *-*-* } 40 } // { dg-error "required from here" "" { target *-*-* } 42 } -// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1483 } -// { dg-error "declaration of" "" { target *-*-* } 1447 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1484 } +// { dg-error "declaration of" "" { target *-*-* } 1448 } diff --git a/libstdc++-v3/testsuite/20_util/result_of/1.cc b/libstdc++-v3/testsuite/20_util/result_of/1.cc new file mode 100644 index 00000000000..0d53f7cfcfa --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/result_of/1.cc @@ -0,0 +1,53 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2012 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 +#include + +struct X { + int i; + void f1() { } + void f2() volatile { } +}; + +typedef int X::*pm; +typedef void (X::*pmf1)(); +typedef void (X::*pmf2)() volatile; + +typedef std::result_of::type result; +static_assert(std::is_same::value, + "invoking cv-qualified pointer-to-member-object"); + +typedef std::result_of::type result1; +static_assert(std::is_void::value, + "invoking cv-qualified pointer-to-member-function"); + +typedef std::result_of::type result2; +static_assert(std::is_void::value, + "invoking cv-qualified pointer-to-member-function"); + +typedef std::result_of::type result3; +static_assert(std::is_same::value, + "invoking pointer-to-member-object on volatile object"); + +typedef std::result_of::type result4; +static_assert(std::is_void::value, + "invoking pointer-to-member-function on volatile object"); + diff --git a/libstdc++-v3/testsuite/20_util/result_of/2.cc b/libstdc++-v3/testsuite/20_util/result_of/2.cc new file mode 100644 index 00000000000..9fc80f7ccb1 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/result_of/2.cc @@ -0,0 +1,47 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2012 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 +#include + +using std::is_same; +using std::result_of; +using std::unique_ptr; + +// Taken from example in [meta.trans.other] + +typedef bool (&PF1)(); +typedef short (*PF2)(long); +struct S { + operator PF2() const; + double operator()(char, int&); + void fn(long) const; + char data; +}; + +typedef void (S::*PMF)(long) const; +typedef char S::*PMD; + +static_assert( is_same::type, short>::value, "!"); +static_assert( is_same::type, double>::value, "!"); +static_assert( is_same::type, bool>::value, "!"); +static_assert( is_same, int)>::type, void>::value, "!"); +static_assert( is_same::type, char&&>::value, "!"); +static_assert( is_same::type, const char&>::value, "!"); -- 2.11.4.GIT