type_traits (declval): Add, per DR 1255.
2009-11-12 Paolo Carlini <paolo.carlini@oracle.com> * include/std/type_traits (declval): Add, per DR 1255. (__is_convertible_helper, common_type): Use it. * include/bits/move.h: Mention std::declval. * testsuite/20_util/declval/requirements/1.cc: New. * testsuite/20_util/declval/requirements/1_neg.cc: Likewise. * testsuite/20_util/common_type/requirements/typedefs-2.cc: Likewise. * testsuite/20_util/common_type/requirements/ explicit_instantiation.cc: Extend. * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Adjust dg-error line numbers. * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Likewise. From-SVN: r154140
This commit is contained in:
parent
3791ce90f6
commit
7274deff73
|
@ -1,3 +1,18 @@
|
|||
2009-11-12 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
* include/std/type_traits (declval): Add, per DR 1255.
|
||||
(__is_convertible_helper, common_type): Use it.
|
||||
* include/bits/move.h: Mention std::declval.
|
||||
* testsuite/20_util/declval/requirements/1.cc: New.
|
||||
* testsuite/20_util/declval/requirements/1_neg.cc: Likewise.
|
||||
* testsuite/20_util/common_type/requirements/typedefs-2.cc: Likewise.
|
||||
* testsuite/20_util/common_type/requirements/
|
||||
explicit_instantiation.cc: Extend.
|
||||
* testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Adjust
|
||||
dg-error line numbers.
|
||||
* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
|
||||
Likewise.
|
||||
|
||||
2009-11-12 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
* include/bits/stl_algobase.h: Include the full <utility>, per
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include <bits/concept_check.h>
|
||||
|
||||
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
||||
#include <type_traits>
|
||||
#include <type_traits> // Brings in std::declval too.
|
||||
|
||||
_GLIBCXX_BEGIN_NAMESPACE(std)
|
||||
|
||||
|
@ -81,6 +81,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
|||
move(_Tp&& __t)
|
||||
{ return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
|
||||
|
||||
/// declval, defined in <type_traits>.
|
||||
|
||||
_GLIBCXX_END_NAMESPACE
|
||||
|
||||
#define _GLIBCXX_MOVE(_Tp) std::move(_Tp)
|
||||
|
|
|
@ -240,6 +240,9 @@ namespace std
|
|||
: public integral_constant<bool, __is_base_of(_Base, _Derived)>
|
||||
{ };
|
||||
|
||||
template<typename _Tp>
|
||||
typename add_rvalue_reference<_Tp>::type declval();
|
||||
|
||||
// Relationships between types.
|
||||
template<typename _From, typename _To,
|
||||
bool = (is_void<_From>::value || is_void<_To>::value
|
||||
|
@ -255,10 +258,9 @@ namespace std
|
|||
private:
|
||||
static __one __test(_To);
|
||||
static __two __test(...);
|
||||
static typename add_rvalue_reference<_From>::type __makeFrom();
|
||||
|
||||
public:
|
||||
static const bool __value = sizeof(__test(__makeFrom())) == 1;
|
||||
static const bool __value = sizeof(__test(declval<_From>())) == 1;
|
||||
};
|
||||
|
||||
// XXX FIXME
|
||||
|
@ -556,23 +558,11 @@ namespace std
|
|||
|
||||
template<typename _Tp>
|
||||
struct common_type<_Tp>
|
||||
{
|
||||
static_assert(sizeof(_Tp) > 0, "must be complete type");
|
||||
typedef _Tp type;
|
||||
};
|
||||
{ typedef _Tp type; };
|
||||
|
||||
template<typename _Tp, typename _Up>
|
||||
class common_type<_Tp, _Up>
|
||||
{
|
||||
static_assert(sizeof(_Tp) > 0, "must be complete type");
|
||||
static_assert(sizeof(_Up) > 0, "must be complete type");
|
||||
|
||||
static _Tp&& __t();
|
||||
static _Up&& __u();
|
||||
|
||||
public:
|
||||
typedef decltype(true ? __t() : __u()) type;
|
||||
};
|
||||
struct common_type<_Tp, _Up>
|
||||
{ typedef decltype(true ? declval<_Tp>() : declval<_Up>()) type; };
|
||||
|
||||
template<typename _Tp, typename _Up, typename... _Vp>
|
||||
struct common_type<_Tp, _Up, _Vp...>
|
||||
|
@ -580,11 +570,26 @@ namespace std
|
|||
typedef typename
|
||||
common_type<typename common_type<_Tp, _Up>::type, _Vp...>::type type;
|
||||
};
|
||||
|
||||
// @} group metaprogramming
|
||||
|
||||
/// declval
|
||||
template<typename _Tp>
|
||||
struct __declval_protector
|
||||
{
|
||||
static const bool __stop = false;
|
||||
static typename add_rvalue_reference<_Tp>::type __delegate();
|
||||
};
|
||||
|
||||
template<typename _Tp>
|
||||
inline typename add_rvalue_reference<_Tp>::type
|
||||
declval()
|
||||
{
|
||||
static_assert(__declval_protector<_Tp>::__stop,
|
||||
"declval() must not be used!");
|
||||
return __declval_protector<_Tp>::__delegate();
|
||||
}
|
||||
}
|
||||
|
||||
#endif // __GXX_EXPERIMENTAL_CXX0X__
|
||||
|
||||
#endif // _GLIBCXX_TYPE_TRAITS
|
||||
|
||||
#endif // _GLIBCXX_TYPE_TRAITS
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
// NB: This file is for testing type_traits with NO OTHER INCLUDES.
|
||||
|
||||
#include <type_traits>
|
||||
|
@ -29,9 +28,14 @@ namespace std
|
|||
typedef int& test_type2;
|
||||
typedef double test_type3;
|
||||
typedef float test_type4;
|
||||
|
||||
typedef void test_type5;
|
||||
typedef const void test_type6;
|
||||
|
||||
template struct common_type<test_type1>;
|
||||
template struct common_type<test_type1, test_type2>;
|
||||
template struct common_type<test_type1, test_type2, test_type3>;
|
||||
template struct common_type<test_type1, test_type2, test_type3, test_type4>;
|
||||
|
||||
template struct common_type<test_type5>;
|
||||
template struct common_type<test_type5, test_type6>;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
// { dg-options "-std=gnu++0x" }
|
||||
// 2009-11-12 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
//
|
||||
// Copyright (C) 2009 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
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <type_traits>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
// DR 1255.
|
||||
void test01()
|
||||
{
|
||||
bool test __attribute__((unused)) = true;
|
||||
using std::common_type;
|
||||
using std::is_same;
|
||||
|
||||
VERIFY( (is_same<common_type<void>::type, void>::value) );
|
||||
VERIFY( (is_same<common_type<const void>::type, const void>::value) );
|
||||
VERIFY( (is_same<common_type<volatile void>::type, volatile void>::value) );
|
||||
VERIFY( (is_same<common_type<const volatile void>::type,
|
||||
const volatile void>::value) );
|
||||
|
||||
VERIFY( (is_same<common_type<void, void>::type, void>::value) );
|
||||
VERIFY( (is_same<common_type<void, const void>::type, void>::value) );
|
||||
VERIFY( (is_same<common_type<void, volatile void>::type, void>::value) );
|
||||
VERIFY( (is_same<common_type<void, const volatile void>::type,
|
||||
void>::value) );
|
||||
VERIFY( (is_same<common_type<const void, void>::type,
|
||||
void>::value) );
|
||||
VERIFY( (is_same<common_type<const void, const void>::type,
|
||||
void>::value) );
|
||||
VERIFY( (is_same<common_type<const void, volatile void>::type,
|
||||
void>::value) );
|
||||
VERIFY( (is_same<common_type<const void, const volatile void>::type,
|
||||
void>::value) );
|
||||
VERIFY( (is_same<common_type<volatile void, void>::type,
|
||||
void>::value) );
|
||||
VERIFY( (is_same<common_type<volatile void, volatile void>::type,
|
||||
void>::value) );
|
||||
VERIFY( (is_same<common_type<volatile void, const void>::type,
|
||||
void>::value) );
|
||||
VERIFY( (is_same<common_type<volatile void, const volatile void>::type,
|
||||
void>::value) );
|
||||
VERIFY( (is_same<common_type<const volatile void, void>::type,
|
||||
void>::value) );
|
||||
VERIFY( (is_same<common_type<const volatile void, const void>::type,
|
||||
void>::value) );
|
||||
VERIFY( (is_same<common_type<const volatile void, volatile void>::type,
|
||||
void>::value) );
|
||||
VERIFY( (is_same<common_type<const volatile void, const volatile void>::type,
|
||||
void>::value) );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test01();
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
// { dg-options "-std=gnu++0x" }
|
||||
// { dg-do compile }
|
||||
// 2009-11-12 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
//
|
||||
// Copyright (C) 2009 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
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <utility>
|
||||
|
||||
template<typename From, typename To>
|
||||
struct is_convertible_mini
|
||||
{
|
||||
private:
|
||||
typedef char one;
|
||||
typedef struct { char arr[2]; } two;
|
||||
|
||||
static one test(To);
|
||||
static two test(...);
|
||||
|
||||
public:
|
||||
static const bool value = sizeof(test(std::declval<From>())) == 1;
|
||||
};
|
||||
|
||||
template<typename From, typename To>
|
||||
const bool is_convertible_mini<From, To>::value;
|
||||
|
||||
void test01()
|
||||
{
|
||||
static_assert(is_convertible_mini<int*, const int*>::value, "#1");
|
||||
static_assert(!is_convertible_mini<const void*, void*>::value, "#2");
|
||||
static_assert(is_convertible_mini<float, double>::value, "#3");
|
||||
static_assert(!is_convertible_mini<bool, int*>::value, "#4");
|
||||
static_assert(is_convertible_mini<int(&)(int), int(*)(int)>::value, "#5");
|
||||
static_assert(!is_convertible_mini<void*, int*>::value, "#6");
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
// { dg-options "-std=gnu++0x" }
|
||||
// { dg-do compile }
|
||||
// 2009-11-12 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
//
|
||||
// Copyright (C) 2009 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
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// { dg-error "static assertion failed" "" { target *-*-* } 587 }
|
||||
// { dg-error "instantiated from here" "" { target *-*-* } 30 }
|
||||
// { dg-excess-errors "In function" }
|
||||
|
||||
#include <utility>
|
||||
|
||||
void test01()
|
||||
{
|
||||
std::declval<int>();
|
||||
}
|
|
@ -48,8 +48,8 @@ void test01()
|
|||
// { dg-error "instantiated from here" "" { target *-*-* } 40 }
|
||||
// { dg-error "instantiated from here" "" { target *-*-* } 42 }
|
||||
|
||||
// { dg-error "invalid use of incomplete type" "" { target *-*-* } 547 }
|
||||
// { dg-error "declaration of" "" { target *-*-* } 509 }
|
||||
// { dg-error "invalid use of incomplete type" "" { target *-*-* } 549 }
|
||||
// { dg-error "declaration of" "" { target *-*-* } 511 }
|
||||
|
||||
// { dg-excess-errors "At global scope" }
|
||||
// { dg-excess-errors "In instantiation of" }
|
||||
|
|
|
@ -48,8 +48,8 @@ void test01()
|
|||
// { dg-error "instantiated from here" "" { target *-*-* } 40 }
|
||||
// { dg-error "instantiated from here" "" { target *-*-* } 42 }
|
||||
|
||||
// { dg-error "invalid use of incomplete type" "" { target *-*-* } 468 }
|
||||
// { dg-error "declaration of" "" { target *-*-* } 430 }
|
||||
// { dg-error "invalid use of incomplete type" "" { target *-*-* } 470 }
|
||||
// { dg-error "declaration of" "" { target *-*-* } 432 }
|
||||
|
||||
// { dg-excess-errors "At global scope" }
|
||||
// { dg-excess-errors "In instantiation of" }
|
||||
|
|
Loading…
Reference in New Issue