diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 21ab1f358cfd86628dd9a50e8ced614c8ae2a57f..5b5e39ddc9029422eb8ea93b8893e2038dc2635c 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 dcfa1c9c4abb0b34b515c47d9939469b9ab7b808..09ad8637de0e14eac07b0cf97bb4a7b919dd6f71 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 d22a58ba038fabd47b1a1a8ef348c0ec530be553..dfb522e819d9e171776b88f77a70444be10a2107 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 0000000000000000000000000000000000000000..356f73cac49d0994da7535961c5caf2fb41c424e --- /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 0000000000000000000000000000000000000000..4b9ecd9e19f6db810f48862361c288c9974b3d8b --- /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 0000000000000000000000000000000000000000..5ff57f6fb6b4e5a403889bf14c08ea2b7b65e545 --- /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 6ec22d024a9c1e86caf0e264e660d94ab403cd6d..f6282a9019691c16e8c0249fa49108b78314f77d 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 0000000000000000000000000000000000000000..87dd950b27d1967010202c3db36b7fdc8181ebd8 --- /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 0000000000000000000000000000000000000000..52ba964b1fdaae62279f1f50eeb8dfe8f1f19748 --- /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 0000000000000000000000000000000000000000..7e704873275a02479c9c480bfcae6a47108fcc71 --- /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 65fc2cece7c1cdee0e57aeb23cbfd4fb2d49f213..b37963330c4583142520e04e26583a91af8c3dc0 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 795755f78546686c302acd342d8137435b0fe3da..0b842b39ea30b5df938c403e50aada2c0114fc0b 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 c92de4378107a4f88ee1b5a2dcea8f3d3dfda151..7ac45bdcaa0895a31f68a0e07836985debb1e056 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; }