diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2009-12-30 23:22:58 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2009-12-30 23:22:58 +0000 |
commit | 75995f378221fd6b0f86c920d64d8e09b6b76f3c (patch) | |
tree | 6830862601b54dd8795e6c9f6929ea52071e63e4 /libstdc++-v3 | |
parent | 8589115b9cf39923208629a049f406b887c0cd3b (diff) | |
download | gcc-75995f378221fd6b0f86c920d64d8e09b6b76f3c.zip gcc-75995f378221fd6b0f86c920d64d8e09b6b76f3c.tar.gz gcc-75995f378221fd6b0f86c920d64d8e09b6b76f3c.tar.bz2 |
[multiple changes]
2009-12-30 Daniel Frey <d.frey@gmx.de>
Paolo Carlini <paolo.carlini@oracle.com>
* include/std/type_traits (is_explicitly_convertible,
is_constructible): Add.
* testsuite/util/testsuite_tr1.h (ExplicitClass): Add.
* testsuite/20_util/is_explicitly_convertible/value.cc: New.
* testsuite/20_util/is_constructible/value.cc: Likewise.
2009-12-30 Paolo Carlini <paolo.carlini@oracle.com>
* testsuite/util/testsuite_tr1.h (test_relationship): Add
variadic version.
* testsuite/20_util/is_explicitly_convertible/requirements/
typedefs.cc: New.
* testsuite/20_util/is_explicitly_convertible/requirements/
explicit_instantiation.cc: Likewise.
* testsuite/20_util/is_constructible/requirements/typedefs.cc:
Likewise.
* testsuite/20_util/is_constructible/requirements/
explicit_instantiation.cc: Likewise.
* testsuite/20_util/is_convertible/value.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.
* testsuite/20_util/declval/requirements/1_neg.cc: Likewise.
From-SVN: r155529
Diffstat (limited to 'libstdc++-v3')
13 files changed, 332 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 21ab1f3..5b5e39d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,31 @@ +2009-12-30 Daniel Frey <d.frey@gmx.de> + Paolo Carlini <paolo.carlini@oracle.com> + + * include/std/type_traits (is_explicitly_convertible, + is_constructible): Add. + * testsuite/util/testsuite_tr1.h (ExplicitClass): Add. + * testsuite/20_util/is_explicitly_convertible/value.cc: New. + * testsuite/20_util/is_constructible/value.cc: Likewise. + +2009-12-30 Paolo Carlini <paolo.carlini@oracle.com> + + * testsuite/util/testsuite_tr1.h (test_relationship): Add + variadic version. + * testsuite/20_util/is_explicitly_convertible/requirements/ + typedefs.cc: New. + * testsuite/20_util/is_explicitly_convertible/requirements/ + explicit_instantiation.cc: Likewise. + * testsuite/20_util/is_constructible/requirements/typedefs.cc: + Likewise. + * testsuite/20_util/is_constructible/requirements/ + explicit_instantiation.cc: Likewise. + * testsuite/20_util/is_convertible/value.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. + * testsuite/20_util/declval/requirements/1_neg.cc: Likewise. + 2009-12-30 Paolo Carlini <paolo.carlini@oracle.com> * include/bits/stl_iterator.h.: Fix typo in comment. diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index dcfa1c9..09ad863 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -272,6 +272,55 @@ namespace std __is_convertible_helper<_From, _To>::__value> { }; + template<typename _To, typename... _From> + struct __is_constructible_helper + : public __sfinae_types + { + private: + template<typename _To1, typename... _From1> + static decltype(_To1(declval<_From1>()...), __one()) __test(int); + + template<typename, typename...> + static __two __test(...); + + public: + static const bool __value = sizeof(__test<_To, _From...>(0)) == 1; + }; + + template<typename _To, typename... _From> + struct is_constructible + : public integral_constant<bool, + __is_constructible_helper<_To, + _From...>::__value> + { }; + + template<typename _To, typename _From> + struct __is_constructible_helper1 + : public __sfinae_types + { + private: + template<typename _To1, typename _From1> + static decltype( static_cast<_To1>(declval<_From1>()), __one()) + __test(int); + + template<typename, typename> + static __two __test(...); + + public: + static const bool __value = sizeof(__test<_To, _From>(0)) == 1; + }; + + template<typename _To, typename _From> + struct is_constructible<_To, _From> + : public integral_constant<bool, + __is_constructible_helper1<_To, _From>::__value> + { }; + + template<typename _From, typename _To> + struct is_explicitly_convertible + : public is_constructible<_To, _From> + { }; + template<std::size_t _Len> struct __aligned_storage_msa { 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 d22a58b..dfb522e 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 // <http://www.gnu.org/licenses/>. -// { dg-error "static assertion failed" "" { target *-*-* } 587 } +// { dg-error "static assertion failed" "" { target *-*-* } 636 } // { dg-error "instantiated from here" "" { target *-*-* } 30 } // { dg-excess-errors "In function" } diff --git a/libstdc++-v3/testsuite/20_util/is_constructible/requirements/explicit_instantiation.cc b/libstdc++-v3/testsuite/20_util/is_constructible/requirements/explicit_instantiation.cc new file mode 100644 index 0000000..356f73c --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_constructible/requirements/explicit_instantiation.cc @@ -0,0 +1,31 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// 2009-12-30 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/>. + +// NB: This file is for testing type_traits with NO OTHER INCLUDES. + +#include <type_traits> + +namespace std +{ + typedef short test_type; + template struct is_constructible<test_type, test_type>; +} diff --git a/libstdc++-v3/testsuite/20_util/is_constructible/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/is_constructible/requirements/typedefs.cc new file mode 100644 index 0000000..4b9ecd9 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_constructible/requirements/typedefs.cc @@ -0,0 +1,36 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// 2009-12-30 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/>. + +// +// NB: This file is for testing type_traits with NO OTHER INCLUDES. + +#include <type_traits> + +void test01() +{ + // Check for required typedefs + typedef std::is_constructible<int, int> test_type; + typedef test_type::value_type value_type; + typedef test_type::type type; + typedef test_type::type::value_type type_value_type; + typedef test_type::type::type type_type; +} diff --git a/libstdc++-v3/testsuite/20_util/is_constructible/value.cc b/libstdc++-v3/testsuite/20_util/is_constructible/value.cc new file mode 100644 index 0000000..5ff57f6 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_constructible/value.cc @@ -0,0 +1,48 @@ +// { dg-options "-std=gnu++0x" } + +// 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> +#include <testsuite_tr1.h> + +void test01() +{ + bool test __attribute__((unused)) = true; + using std::is_constructible; + using namespace __gnu_test; + + // Positive tests. + VERIFY( (test_relationship<is_constructible, ExplicitClass, + double&>(true)) ); + VERIFY( (test_relationship<is_constructible, ExplicitClass, + int&>(true)) ); + + // Negative tests. + VERIFY( (test_relationship<is_constructible, ExplicitClass, + void*>(false)) ); + VERIFY( (test_relationship<is_constructible, ExplicitClass>(false)) ); + VERIFY( (test_relationship<is_constructible, ExplicitClass, + int, double>(false)) ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/20_util/is_convertible/value.cc b/libstdc++-v3/testsuite/20_util/is_convertible/value.cc index 6ec22d0..f6282a9 100644 --- a/libstdc++-v3/testsuite/20_util/is_convertible/value.cc +++ b/libstdc++-v3/testsuite/20_util/is_convertible/value.cc @@ -56,6 +56,7 @@ void test01() VERIFY( (test_relationship<is_convertible, void, void>(true)) ); VERIFY( (test_relationship<is_convertible, const void, void>(true)) ); VERIFY( (test_relationship<is_convertible, void, volatile void>(true)) ); + VERIFY( (test_relationship<is_convertible, double&, ExplicitClass>(true)) ); // Negative tests. VERIFY( (test_relationship<is_convertible, const int*, int*>(false)) ); @@ -93,6 +94,9 @@ void test01() VERIFY( (test_relationship<is_convertible, volatile int, volatile int&>(false)) ); VERIFY( (test_relationship<is_convertible, int(int), int(&)(int)>(false)) ); + + VERIFY( (test_relationship<is_convertible, int&, ExplicitClass>(false)) ); + VERIFY( (test_relationship<is_convertible, void*, ExplicitClass>(false)) ); } int main() diff --git a/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/explicit_instantiation.cc b/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/explicit_instantiation.cc new file mode 100644 index 0000000..87dd950 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/explicit_instantiation.cc @@ -0,0 +1,31 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// 2009-12-30 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/>. + +// NB: This file is for testing type_traits with NO OTHER INCLUDES. + +#include <type_traits> + +namespace std +{ + typedef short test_type; + template struct is_explicitly_convertible<test_type, test_type>; +} diff --git a/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/typedefs.cc new file mode 100644 index 0000000..52ba964 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/typedefs.cc @@ -0,0 +1,36 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// 2009-12-30 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/>. + +// +// NB: This file is for testing type_traits with NO OTHER INCLUDES. + +#include <type_traits> + +void test01() +{ + // Check for required typedefs + typedef std::is_explicitly_convertible<int, int> test_type; + typedef test_type::value_type value_type; + typedef test_type::type type; + typedef test_type::type::value_type type_value_type; + typedef test_type::type::type type_type; +} diff --git a/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/value.cc b/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/value.cc new file mode 100644 index 0000000..7e70487 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/value.cc @@ -0,0 +1,45 @@ +// { dg-options "-std=gnu++0x" } + +// 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> +#include <testsuite_tr1.h> + +void test01() +{ + bool test __attribute__((unused)) = true; + using std::is_explicitly_convertible; + using namespace __gnu_test; + + // Positive tests. + VERIFY( (test_relationship<is_explicitly_convertible, double&, + ExplicitClass>(true)) ); + VERIFY( (test_relationship<is_explicitly_convertible, int&, + ExplicitClass>(true)) ); + + // Negative tests. + VERIFY( (test_relationship<is_explicitly_convertible, void*, + ExplicitClass>(false)) ); +} + +int main() +{ + test01(); + return 0; +} 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 65fc2ce..b379633 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,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 *-*-* } 549 } -// { dg-error "declaration of" "" { target *-*-* } 511 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 598 } +// { dg-error "declaration of" "" { target *-*-* } 560 } // { dg-excess-errors "At global scope" } // { dg-excess-errors "In instantiation of" } 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 795755f..0b842b3 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,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 *-*-* } 470 } -// { dg-error "declaration of" "" { target *-*-* } 432 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 519 } +// { dg-error "declaration of" "" { target *-*-* } 481 } // { dg-excess-errors "At global scope" } // { dg-excess-errors "In instantiation of" } diff --git a/libstdc++-v3/testsuite/util/testsuite_tr1.h b/libstdc++-v3/testsuite/util/testsuite_tr1.h index c92de43..7ac45bd 100644 --- a/libstdc++-v3/testsuite/util/testsuite_tr1.h +++ b/libstdc++-v3/testsuite/util/testsuite_tr1.h @@ -67,6 +67,18 @@ namespace __gnu_test return ret; } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<template<typename...> class Relationship, + typename... Types> + bool + test_relationship(bool value) + { + bool ret = true; + ret &= Relationship<Types...>::value == value; + ret &= Relationship<Types...>::type::value == value; + return ret; + } +#else template<template<typename, typename> class Relationship, typename Type1, typename Type2> bool @@ -77,6 +89,7 @@ namespace __gnu_test ret &= Relationship<Type1, Type2>::type::value == value; return ret; } +#endif // Test types. class ClassType { }; @@ -112,6 +125,12 @@ namespace __gnu_test class IncompleteClass; + struct ExplicitClass + { + ExplicitClass(double&); + explicit ExplicitClass(int&); + }; + int truncate_float(float x) { return (int)x; } long truncate_double(double x) { return (long)x; } |