diff options
author | Benjamin Kosnik <bkoz@redhat.com> | 2005-11-10 02:05:13 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2005-11-10 02:05:13 +0000 |
commit | 720e2f72c3d2a5b538f519da0a5d18173989d8e1 (patch) | |
tree | 6d3e047cb7440acf5457057991b12ca9d7a93b10 | |
parent | bc33cab29c4b07f07b894749855c36c5fd76ed78 (diff) | |
download | gcc-720e2f72c3d2a5b538f519da0a5d18173989d8e1.zip gcc-720e2f72c3d2a5b538f519da0a5d18173989d8e1.tar.gz gcc-720e2f72c3d2a5b538f519da0a5d18173989d8e1.tar.bz2 |
re PR libstdc++/22203 (std::numeric_limits<int>::traps is wrong on PPC)
2005-11-09 Benjamin Kosnik <bkoz@redhat.com>
Paolo Carlini <pcarlini@suse.de>
Gabriel Dos Reis <gdr@integrable-solutions.net>
PR libstdc++/22203
* numeric_limits.cc: Split into...
* numeric_limits/specialization.cc: ..this.
* numeric_limits/is_iec559.cc: Same.
* numeric_limits/sign.cc: Same.
* numeric_limits/quiet_NaN.cc: Same.
* numeric_limits/digits10.cc: Same.
* numeric_limits/denorm_min.cc: Same.
* numeric_limits/min_max.cc: Same.
* numeric_limits/epsilon.cc: Same.
* numeric_limits/infinity.cc: Same.
* numeric_limits/traps.cc: New.
Co-Authored-By: Gabriel Dos Reis <gdr@integrable-solutions.net>
Co-Authored-By: Paolo Carlini <pcarlini@suse.de>
From-SVN: r106727
12 files changed, 706 insertions, 350 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 60bcb20..da33a22 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,20 @@ +2005-11-09 Benjamin Kosnik <bkoz@redhat.com> + Paolo Carlini <pcarlini@suse.de> + Gabriel Dos Reis <gdr@integrable-solutions.net> + + PR libstdc++/22203 + * numeric_limits.cc: Split into... + * numeric_limits/specialization.cc: ..this. + * numeric_limits/is_iec559.cc: Same. + * numeric_limits/sign.cc: Same. + * numeric_limits/quiet_NaN.cc: Same. + * numeric_limits/digits10.cc: Same. + * numeric_limits/denorm_min.cc: Same. + * numeric_limits/min_max.cc: Same. + * numeric_limits/epsilon.cc: Same. + * numeric_limits/infinity.cc: Same. + * numeric_limits/traps.cc: New. + 2005-11-09 Paolo Carlini <pcarlini@suse.de> * include/tr1/boost_shared_ptr.h: Trivial formatting fixes. diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits.cc b/libstdc++-v3/testsuite/18_support/numeric_limits.cc deleted file mode 100644 index f04f05f..0000000 --- a/libstdc++-v3/testsuite/18_support/numeric_limits.cc +++ /dev/null @@ -1,350 +0,0 @@ -// { dg-options "-mieee" { target alpha*-*-* } } -// { dg-options "-mieee" { target sh*-*-* } } - -// 1999-08-23 bkoz - -// Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation -// -// 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 2, 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 COPYING. If not, write to the Free -// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, -// USA. - -// 18.2.1.1 template class numeric_limits - -#include <limits> -#include <limits.h> -#include <float.h> -#include <cwchar> -#include <testsuite_hooks.h> - -template<typename T> -struct extrema { - static T min; - static T max; -}; - - -#define DEFINE_EXTREMA(T, m, M) \ - template<> T extrema<T>::min = m; \ - template<> T extrema<T>::max = M - -DEFINE_EXTREMA(char, CHAR_MIN, CHAR_MAX); -DEFINE_EXTREMA(signed char, SCHAR_MIN, SCHAR_MAX); -DEFINE_EXTREMA(unsigned char, 0, UCHAR_MAX); -DEFINE_EXTREMA(short, SHRT_MIN, SHRT_MAX); -DEFINE_EXTREMA(unsigned short, 0, USHRT_MAX); -DEFINE_EXTREMA(int, INT_MIN, INT_MAX); -DEFINE_EXTREMA(unsigned, 0U, UINT_MAX); -DEFINE_EXTREMA(long, LONG_MIN, LONG_MAX); -DEFINE_EXTREMA(unsigned long, 0UL, ULONG_MAX); - -#if _GLIBCXX_USE_WCHAR_T -DEFINE_EXTREMA(wchar_t, WCHAR_MIN, WCHAR_MAX); -#endif //_GLIBCXX_USE_WCHAR_T - -DEFINE_EXTREMA(float, FLT_MIN, FLT_MAX); -DEFINE_EXTREMA(double, DBL_MIN, DBL_MAX); -DEFINE_EXTREMA(long double, LDBL_MIN, LDBL_MAX); - -#undef DEFINE_EXTREMA - -template<typename T> -void test_extrema() -{ - bool test __attribute__((unused)) = true; - T limits_min = std::numeric_limits<T>::min(); - T limits_max = std::numeric_limits<T>::max(); - T extrema_min = extrema<T>::min; - T extrema_max = extrema<T>::max; - VERIFY( extrema_min == limits_min ); - VERIFY( extrema_max == limits_max ); -} - -template<typename T> -void test_epsilon() -{ - bool test __attribute__((unused)) = true; - T epsilon = std::numeric_limits<T>::epsilon(); - T one = 1; - - VERIFY( one != (one + epsilon) ); -} - -#ifdef __CHAR_UNSIGNED__ -#define char_is_signed false -#else -#define char_is_signed true -#endif - -void test_sign() -{ - bool test __attribute__((unused)) = true; - VERIFY( std::numeric_limits<char>::is_signed == char_is_signed ); - VERIFY( std::numeric_limits<signed char>::is_signed == true ); - VERIFY( std::numeric_limits<unsigned char>::is_signed == false ); - VERIFY( std::numeric_limits<short>::is_signed == true ); - VERIFY( std::numeric_limits<unsigned short>::is_signed == false ); - VERIFY( std::numeric_limits<int>::is_signed == true ); - VERIFY( std::numeric_limits<unsigned>::is_signed == false ); - VERIFY( std::numeric_limits<long>::is_signed == true ); - VERIFY( std::numeric_limits<unsigned long>::is_signed == false ); - VERIFY( std::numeric_limits<float>::is_signed == true ); - VERIFY( std::numeric_limits<double>::is_signed == true ); - VERIFY( std::numeric_limits<long double>::is_signed == true ); -} - - -template<typename T> -void -test_infinity() -{ - bool test; - - if (std::numeric_limits<T>::has_infinity) - { - T inf = std::numeric_limits<T>::infinity(); - test = (inf + inf == inf); - } - else - test = true; - - VERIFY (test); -} - -template<typename T> -void -test_denorm_min() -{ - bool test; - - if (std::numeric_limits<T>::has_denorm == std::denorm_present) - { - T denorm = std::numeric_limits<T>::denorm_min(); - test = (denorm > 0); - } - else - test = true; - - VERIFY (test); -} - -template<typename T> -void -test_qnan() -{ - bool test; - - if (std::numeric_limits<T>::has_quiet_NaN) - { - T nan = std::numeric_limits<T>::quiet_NaN(); - test = (nan != nan); - } - else - test = true; - - VERIFY (test); -} - - -template<typename T> -void -test_is_iec559() -{ - bool test; - - if (std::numeric_limits<T>::is_iec559) - { - // IEC 559 requires all of the following. - test = (std::numeric_limits<T>::has_infinity - && std::numeric_limits<T>::has_quiet_NaN - && std::numeric_limits<T>::has_signaling_NaN); - } - else - { - // If we had all of the following, why didn't we set IEC 559? - test = (!std::numeric_limits<T>::has_infinity - || !std::numeric_limits<T>::has_quiet_NaN - || !std::numeric_limits<T>::has_signaling_NaN); - } - - VERIFY (test); -} - - -template<typename T> - struct A - { - int key; - public: - A(int i = 0): key(i) { } - bool - operator==(int i) { return i == key; } - }; - -struct B -{ - B(int i = 0) { } -}; - - -bool test01() -{ - bool test __attribute__((unused)) = true; - std::numeric_limits< A<B> > obj; - - VERIFY( !obj.is_specialized ); - VERIFY( obj.min() == 0 ); - VERIFY( obj.max() == 0 ); - VERIFY( obj.digits == 0 ); - VERIFY( obj.digits10 == 0 ); - VERIFY( !obj.is_signed ); - VERIFY( !obj.is_integer ); - VERIFY( !obj.is_exact ); - VERIFY( obj.radix == 0 ); - VERIFY( obj.epsilon() == 0 ); - VERIFY( obj.round_error() == 0 ); - VERIFY( obj.min_exponent == 0 ); - VERIFY( obj.min_exponent10 == 0 ); - VERIFY( obj.max_exponent == 0 ); - VERIFY( obj.max_exponent10 == 0 ); - VERIFY( !obj.has_infinity ); - VERIFY( !obj.has_quiet_NaN ); - VERIFY( !obj.has_signaling_NaN ); - VERIFY( !obj.has_denorm ); - VERIFY( !obj.has_denorm_loss ); - VERIFY( obj.infinity() == 0 ); - VERIFY( obj.quiet_NaN() == 0 ); - VERIFY( obj.signaling_NaN() == 0 ); - VERIFY( obj.denorm_min() == 0 ); - VERIFY( !obj.is_iec559 ); - VERIFY( !obj.is_bounded ); - VERIFY( !obj.is_modulo ); - VERIFY( !obj.traps ); - VERIFY( !obj.tinyness_before ); - VERIFY( obj.round_style == std::round_toward_zero ); - return test; -} - -// test linkage of the generic bits -template struct std::numeric_limits<B>; - -void test02() -{ - typedef std::numeric_limits<B> b_nl_type; - - // Should probably do all of them... - const int* __attribute__((unused)) pi1 = &b_nl_type::digits; - const int* __attribute__((unused)) pi2 = &b_nl_type::digits10; - const int* __attribute__((unused)) pi3 = &b_nl_type::max_exponent10; - const bool* __attribute__((unused)) pb1 = &b_nl_type::traps; -} - -// libstdc++/5045 -bool test03() -{ - bool test __attribute__((unused)) = true; - - VERIFY( std::numeric_limits<bool>::digits10 == 0 ); - if (__CHAR_BIT__ == 8) - { - VERIFY( std::numeric_limits<signed char>::digits10 == 2 ); - VERIFY( std::numeric_limits<unsigned char>::digits10 == 2 ); - } - if (__CHAR_BIT__ * sizeof(short) == 16) - { - VERIFY( std::numeric_limits<signed short>::digits10 == 4 ); - VERIFY( std::numeric_limits<unsigned short>::digits10 == 4 ); - } - if (__CHAR_BIT__ * sizeof(int) == 32) - { - VERIFY( std::numeric_limits<signed int>::digits10 == 9 ); - VERIFY( std::numeric_limits<unsigned int>::digits10 == 9 ); - } - if (__CHAR_BIT__ * sizeof(long long) == 64) - { - VERIFY( std::numeric_limits<signed long long>::digits10 == 18 ); - VERIFY( std::numeric_limits<unsigned long long>::digits10 == 19 ); - } - return test; -} - -// libstdc++/8949 -bool test04() -{ - bool test __attribute__((unused)) = true; - - VERIFY( !std::numeric_limits<short>::is_iec559 ); - VERIFY( !std::numeric_limits<unsigned short>::is_iec559 ); - VERIFY( !std::numeric_limits<int>::is_iec559 ); - VERIFY( !std::numeric_limits<unsigned int>::is_iec559 ); - VERIFY( !std::numeric_limits<long>::is_iec559 ); - VERIFY( !std::numeric_limits<unsigned long>::is_iec559 ); - VERIFY( !std::numeric_limits<long long>::is_iec559 ); - VERIFY( !std::numeric_limits<unsigned long long>::is_iec559 ); - return test; -} - -int main() -{ - test01(); - test02(); - test03(); - test04(); - - test_extrema<char>(); - test_extrema<signed char>(); - test_extrema<unsigned char>(); - - test_extrema<short>(); - test_extrema<unsigned short>(); - - test_extrema<int>(); - test_extrema<unsigned>(); - - test_extrema<long>(); - test_extrema<unsigned long>(); - - test_extrema<float>(); - test_extrema<double>(); - test_extrema<long double>(); - - test_epsilon<float>(); - test_epsilon<double>(); - test_epsilon<long double>(); - - test_sign(); - - test_infinity<float>(); - test_infinity<double>(); - test_infinity<long double>(); - - test_denorm_min<float>(); - test_denorm_min<double>(); - test_denorm_min<long double>(); - - test_qnan<float>(); - test_qnan<double>(); - test_qnan<long double>(); - - // ??? How to test SNaN? We'd perhaps have to be prepared - // to catch SIGFPE. Can't rely on a signal getting through - // since the exception can be disabled in the FPU. - - test_is_iec559<float>(); - test_is_iec559<double>(); - test_is_iec559<long double>(); - - return 0; -} diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc b/libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc new file mode 100644 index 0000000..d0a9c59 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc @@ -0,0 +1,56 @@ +// { dg-options "-mieee" { target alpha*-*-* } } +// { dg-options "-mieee" { target sh*-*-* } } + +// 1999-08-23 bkoz + +// Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation +// +// 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 18.2.1.1 template class numeric_limits + +#include <limits> +#include <limits.h> +#include <float.h> +#include <cwchar> +#include <testsuite_hooks.h> + +template<typename T> +void +test_denorm_min() +{ + bool test; + + if (std::numeric_limits<T>::has_denorm == std::denorm_present) + { + T denorm = std::numeric_limits<T>::denorm_min(); + test = (denorm > 0); + } + else + test = true; + + VERIFY (test); +} + +int main() +{ + test_denorm_min<float>(); + test_denorm_min<double>(); + test_denorm_min<long double>(); + + return 0; +} diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/digits10.cc b/libstdc++-v3/testsuite/18_support/numeric_limits/digits10.cc new file mode 100644 index 0000000..57bff34 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/digits10.cc @@ -0,0 +1,66 @@ +// { dg-options "-mieee" { target alpha*-*-* } } +// { dg-options "-mieee" { target sh*-*-* } } + +// 1999-08-23 bkoz + +// Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation +// +// 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 18.2.1.1 template class numeric_limits + +#include <limits> +#include <limits.h> +#include <float.h> +#include <cwchar> +#include <testsuite_hooks.h> + +// libstdc++/5045 +bool test03() +{ + bool test __attribute__((unused)) = true; + + VERIFY( std::numeric_limits<bool>::digits10 == 0 ); + if (__CHAR_BIT__ == 8) + { + VERIFY( std::numeric_limits<signed char>::digits10 == 2 ); + VERIFY( std::numeric_limits<unsigned char>::digits10 == 2 ); + } + if (__CHAR_BIT__ * sizeof(short) == 16) + { + VERIFY( std::numeric_limits<signed short>::digits10 == 4 ); + VERIFY( std::numeric_limits<unsigned short>::digits10 == 4 ); + } + if (__CHAR_BIT__ * sizeof(int) == 32) + { + VERIFY( std::numeric_limits<signed int>::digits10 == 9 ); + VERIFY( std::numeric_limits<unsigned int>::digits10 == 9 ); + } + if (__CHAR_BIT__ * sizeof(long long) == 64) + { + VERIFY( std::numeric_limits<signed long long>::digits10 == 18 ); + VERIFY( std::numeric_limits<unsigned long long>::digits10 == 19 ); + } + return test; +} + +int main() +{ + test03(); + + return 0; +} diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/epsilon.cc b/libstdc++-v3/testsuite/18_support/numeric_limits/epsilon.cc new file mode 100644 index 0000000..9a0e755 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/epsilon.cc @@ -0,0 +1,49 @@ +// { dg-options "-mieee" { target alpha*-*-* } } +// { dg-options "-mieee" { target sh*-*-* } } + +// 1999-08-23 bkoz + +// Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation +// +// 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 18.2.1.1 template class numeric_limits + +#include <limits> +#include <limits.h> +#include <float.h> +#include <cwchar> +#include <testsuite_hooks.h> + +template<typename T> +void test_epsilon() +{ + bool test __attribute__((unused)) = true; + T epsilon = std::numeric_limits<T>::epsilon(); + T one = 1; + + VERIFY( one != (one + epsilon) ); +} + +int main() +{ + test_epsilon<float>(); + test_epsilon<double>(); + test_epsilon<long double>(); + + return 0; +} diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/infinity.cc b/libstdc++-v3/testsuite/18_support/numeric_limits/infinity.cc new file mode 100644 index 0000000..c6398a0 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/infinity.cc @@ -0,0 +1,56 @@ +// { dg-options "-mieee" { target alpha*-*-* } } +// { dg-options "-mieee" { target sh*-*-* } } + +// 1999-08-23 bkoz + +// Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation +// +// 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 18.2.1.1 template class numeric_limits + +#include <limits> +#include <limits.h> +#include <float.h> +#include <cwchar> +#include <testsuite_hooks.h> + +template<typename T> +void +test_infinity() +{ + bool test; + + if (std::numeric_limits<T>::has_infinity) + { + T inf = std::numeric_limits<T>::infinity(); + test = (inf + inf == inf); + } + else + test = true; + + VERIFY (test); +} + +int main() +{ + test_infinity<float>(); + test_infinity<double>(); + test_infinity<long double>(); + + return 0; +} diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/is_iec559.cc b/libstdc++-v3/testsuite/18_support/numeric_limits/is_iec559.cc new file mode 100644 index 0000000..8433759 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/is_iec559.cc @@ -0,0 +1,81 @@ +// { dg-options "-mieee" { target alpha*-*-* } } +// { dg-options "-mieee" { target sh*-*-* } } + +// 1999-08-23 bkoz + +// Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation +// +// 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 18.2.1.1 template class numeric_limits + +#include <limits> +#include <limits.h> +#include <float.h> +#include <cwchar> +#include <testsuite_hooks.h> + +template<typename T> +void +test_is_iec559() +{ + bool test; + + if (std::numeric_limits<T>::is_iec559) + { + // IEC 559 requires all of the following. + test = (std::numeric_limits<T>::has_infinity + && std::numeric_limits<T>::has_quiet_NaN + && std::numeric_limits<T>::has_signaling_NaN); + } + else + { + // If we had all of the following, why didn't we set IEC 559? + test = (!std::numeric_limits<T>::has_infinity + || !std::numeric_limits<T>::has_quiet_NaN + || !std::numeric_limits<T>::has_signaling_NaN); + } + + VERIFY (test); +} + +// libstdc++/8949 +bool test04() +{ + bool test __attribute__((unused)) = true; + + VERIFY( !std::numeric_limits<short>::is_iec559 ); + VERIFY( !std::numeric_limits<unsigned short>::is_iec559 ); + VERIFY( !std::numeric_limits<int>::is_iec559 ); + VERIFY( !std::numeric_limits<unsigned int>::is_iec559 ); + VERIFY( !std::numeric_limits<long>::is_iec559 ); + VERIFY( !std::numeric_limits<unsigned long>::is_iec559 ); + VERIFY( !std::numeric_limits<long long>::is_iec559 ); + VERIFY( !std::numeric_limits<unsigned long long>::is_iec559 ); + return test; +} + +int main() +{ + test_is_iec559<float>(); + test_is_iec559<double>(); + test_is_iec559<long double>(); + + test04(); + + return 0; +} diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/min_max.cc b/libstdc++-v3/testsuite/18_support/numeric_limits/min_max.cc new file mode 100644 index 0000000..d300458 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/min_max.cc @@ -0,0 +1,95 @@ +// { dg-options "-mieee" { target alpha*-*-* } } +// { dg-options "-mieee" { target sh*-*-* } } + +// 1999-08-23 bkoz + +// Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation +// +// 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 18.2.1.1 template class numeric_limits + +#include <limits> +#include <limits.h> +#include <float.h> +#include <cwchar> +#include <testsuite_hooks.h> + +template<typename T> +struct extrema { + static T min; + static T max; +}; + + +#define DEFINE_EXTREMA(T, m, M) \ + template<> T extrema<T>::min = m; \ + template<> T extrema<T>::max = M + +DEFINE_EXTREMA(char, CHAR_MIN, CHAR_MAX); +DEFINE_EXTREMA(signed char, SCHAR_MIN, SCHAR_MAX); +DEFINE_EXTREMA(unsigned char, 0, UCHAR_MAX); +DEFINE_EXTREMA(short, SHRT_MIN, SHRT_MAX); +DEFINE_EXTREMA(unsigned short, 0, USHRT_MAX); +DEFINE_EXTREMA(int, INT_MIN, INT_MAX); +DEFINE_EXTREMA(unsigned, 0U, UINT_MAX); +DEFINE_EXTREMA(long, LONG_MIN, LONG_MAX); +DEFINE_EXTREMA(unsigned long, 0UL, ULONG_MAX); + +#if _GLIBCXX_USE_WCHAR_T +DEFINE_EXTREMA(wchar_t, WCHAR_MIN, WCHAR_MAX); +#endif //_GLIBCXX_USE_WCHAR_T + +DEFINE_EXTREMA(float, FLT_MIN, FLT_MAX); +DEFINE_EXTREMA(double, DBL_MIN, DBL_MAX); +DEFINE_EXTREMA(long double, LDBL_MIN, LDBL_MAX); + +#undef DEFINE_EXTREMA + +template<typename T> +void test_extrema() +{ + bool test __attribute__((unused)) = true; + T limits_min = std::numeric_limits<T>::min(); + T limits_max = std::numeric_limits<T>::max(); + T extrema_min = extrema<T>::min; + T extrema_max = extrema<T>::max; + VERIFY( extrema_min == limits_min ); + VERIFY( extrema_max == limits_max ); +} + +int main() +{ + test_extrema<char>(); + test_extrema<signed char>(); + test_extrema<unsigned char>(); + + test_extrema<short>(); + test_extrema<unsigned short>(); + + test_extrema<int>(); + test_extrema<unsigned>(); + + test_extrema<long>(); + test_extrema<unsigned long>(); + + test_extrema<float>(); + test_extrema<double>(); + test_extrema<long double>(); + + return 0; +} diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/quiet_NaN.cc b/libstdc++-v3/testsuite/18_support/numeric_limits/quiet_NaN.cc new file mode 100644 index 0000000..ef2aab6 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/quiet_NaN.cc @@ -0,0 +1,56 @@ +// { dg-options "-mieee" { target alpha*-*-* } } +// { dg-options "-mieee" { target sh*-*-* } } + +// 1999-08-23 bkoz + +// Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation +// +// 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 18.2.1.1 template class numeric_limits + +#include <limits> +#include <limits.h> +#include <float.h> +#include <cwchar> +#include <testsuite_hooks.h> + +template<typename T> +void +test_qnan() +{ + bool test; + + if (std::numeric_limits<T>::has_quiet_NaN) + { + T nan = std::numeric_limits<T>::quiet_NaN(); + test = (nan != nan); + } + else + test = true; + + VERIFY (test); +} + +int main() +{ + test_qnan<float>(); + test_qnan<double>(); + test_qnan<long double>(); + + return 0; +} diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/sign.cc b/libstdc++-v3/testsuite/18_support/numeric_limits/sign.cc new file mode 100644 index 0000000..e6c5f1d --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/sign.cc @@ -0,0 +1,60 @@ +// { dg-options "-mieee" { target alpha*-*-* } } +// { dg-options "-mieee" { target sh*-*-* } } + +// 1999-08-23 bkoz + +// Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation +// +// 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 18.2.1.1 template class numeric_limits + +#include <limits> +#include <limits.h> +#include <float.h> +#include <cwchar> +#include <testsuite_hooks.h> + +#ifdef __CHAR_UNSIGNED__ +#define char_is_signed false +#else +#define char_is_signed true +#endif + +void test_sign() +{ + bool test __attribute__((unused)) = true; + VERIFY( std::numeric_limits<char>::is_signed == char_is_signed ); + VERIFY( std::numeric_limits<signed char>::is_signed == true ); + VERIFY( std::numeric_limits<unsigned char>::is_signed == false ); + VERIFY( std::numeric_limits<short>::is_signed == true ); + VERIFY( std::numeric_limits<unsigned short>::is_signed == false ); + VERIFY( std::numeric_limits<int>::is_signed == true ); + VERIFY( std::numeric_limits<unsigned>::is_signed == false ); + VERIFY( std::numeric_limits<long>::is_signed == true ); + VERIFY( std::numeric_limits<unsigned long>::is_signed == false ); + VERIFY( std::numeric_limits<float>::is_signed == true ); + VERIFY( std::numeric_limits<double>::is_signed == true ); + VERIFY( std::numeric_limits<long double>::is_signed == true ); +} + +int main() +{ + test_sign(); + + return 0; +} diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/specialization.cc b/libstdc++-v3/testsuite/18_support/numeric_limits/specialization.cc new file mode 100644 index 0000000..815b7f5 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/specialization.cc @@ -0,0 +1,107 @@ +// { dg-options "-mieee" { target alpha*-*-* } } +// { dg-options "-mieee" { target sh*-*-* } } + +// 1999-08-23 bkoz + +// Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation +// +// 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 18.2.1.1 template class numeric_limits + +#include <limits> +#include <limits.h> +#include <float.h> +#include <cwchar> +#include <testsuite_hooks.h> + +template<typename T> + struct A + { + int key; + public: + A(int i = 0): key(i) { } + bool + operator==(int i) { return i == key; } + }; + +struct B +{ + B(int i = 0) { } +}; + + +bool test01() +{ + bool test __attribute__((unused)) = true; + std::numeric_limits< A<B> > obj; + + VERIFY( !obj.is_specialized ); + VERIFY( obj.min() == 0 ); + VERIFY( obj.max() == 0 ); + VERIFY( obj.digits == 0 ); + VERIFY( obj.digits10 == 0 ); + VERIFY( !obj.is_signed ); + VERIFY( !obj.is_integer ); + VERIFY( !obj.is_exact ); + VERIFY( obj.radix == 0 ); + VERIFY( obj.epsilon() == 0 ); + VERIFY( obj.round_error() == 0 ); + VERIFY( obj.min_exponent == 0 ); + VERIFY( obj.min_exponent10 == 0 ); + VERIFY( obj.max_exponent == 0 ); + VERIFY( obj.max_exponent10 == 0 ); + VERIFY( !obj.has_infinity ); + VERIFY( !obj.has_quiet_NaN ); + VERIFY( !obj.has_signaling_NaN ); + VERIFY( !obj.has_denorm ); + VERIFY( !obj.has_denorm_loss ); + VERIFY( obj.infinity() == 0 ); + VERIFY( obj.quiet_NaN() == 0 ); + VERIFY( obj.signaling_NaN() == 0 ); + VERIFY( obj.denorm_min() == 0 ); + VERIFY( !obj.is_iec559 ); + VERIFY( !obj.is_bounded ); + VERIFY( !obj.is_modulo ); + VERIFY( !obj.traps ); + VERIFY( !obj.tinyness_before ); + VERIFY( obj.round_style == std::round_toward_zero ); + return test; +} + +// test linkage of the generic bits +template struct std::numeric_limits<B>; + +void test02() +{ + typedef std::numeric_limits<B> b_nl_type; + + // Should probably do all of them... + const int* __attribute__((unused)) pi1 = &b_nl_type::digits; + const int* __attribute__((unused)) pi2 = &b_nl_type::digits10; + const int* __attribute__((unused)) pi3 = &b_nl_type::max_exponent10; + const bool* __attribute__((unused)) pb1 = &b_nl_type::traps; +} + + +int main() +{ + test01(); + test02(); + + return 0; +} diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/traps.cc b/libstdc++-v3/testsuite/18_support/numeric_limits/traps.cc new file mode 100644 index 0000000..e9bdd84 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/traps.cc @@ -0,0 +1,63 @@ +// { dg-options "-mieee" { target alpha*-*-* } } +// { dg-options "-mieee" { target sh*-*-* } } + +// Copyright (C) 2005 Free Software Foundation +// +// 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 18.2.1.1 template class numeric_limits + +#include <limits> +#include <testsuite_hooks.h> + +template<typename T> + void + test_traps() + { + typedef T value_type; + volatile value_type i(5); + volatile value_type j(0); + + if (!std::numeric_limits<value_type>::traps) + value_type r = i/j; + } + +// libstdc++/22203 +int main() +{ + test_traps<int>(); + test_traps<unsigned int>(); + test_traps<long>(); + test_traps<unsigned long>(); + test_traps<long long>(); + test_traps<unsigned long long>(); + + /* + For floating points, trapping is a different, more complicated + story. If is_iecxxx is true, then division by zero would not trap + (infinity). If is_iecxxx is false, we don't know (VAX may trap for + 0/0 -- I have to check). For most cases (i.e. IEE-754), trapping + for floating points have to do with whether there is a support for + signaling NaN. + - Gaby. + */ + // test_traps<float>(); + // test_traps<double>(); + // test_traps<long double>(); + + return 0; +} |