From 4e30cb71f94c2874b93f2c27a839d816e11f81e5 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Thu, 25 Jul 2013 21:24:07 +0000 Subject: [PATCH] complex (pow(const complex<>&, int)): Enable in C++11 mode too. 2013-07-25 Paolo Carlini * include/std/complex (pow(const complex<>&, int)): Enable in C++11 mode too. * testsuite/26_numerics/complex/dr844.cc: Adjust. * doc/xml/manual/intro.xml: Update. From-SVN: r201253 --- libstdc++-v3/ChangeLog | 11 +++++++++-- libstdc++-v3/doc/xml/manual/intro.xml | 6 ------ libstdc++-v3/include/std/complex | 11 +++++------ libstdc++-v3/testsuite/26_numerics/complex/dr844.cc | 8 +++++--- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index df3698fbf7a..ac2cb45ba07 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,11 +1,18 @@ +2013-07-25 Paolo Carlini + + * include/std/complex (pow(const complex<>&, int)): Enable in + C++11 mode too. + * testsuite/26_numerics/complex/dr844.cc: Adjust. + * doc/xml/manual/intro.xml: Update. + 2013-07-25 Tim Shen Add documents and comments. * include/bits/regex.h: Documents and comments. * include/bits/regex_grep_matcher.h: Likewise. * include/bits/regex_grep_matcher.tcc: Likewise. - * testsuite/28_regex/iterators/regex_iterator/char/string_position_01.cc: - New. + * testsuite/28_regex/iterators/regex_iterator/char/ + string_position_01.cc: New. 2013-07-24 Paolo Carlini diff --git a/libstdc++-v3/doc/xml/manual/intro.xml b/libstdc++-v3/doc/xml/manual/intro.xml index d4f9dec24b5..cb141865780 100644 --- a/libstdc++-v3/doc/xml/manual/intro.xml +++ b/libstdc++-v3/doc/xml/manual/intro.xml @@ -791,12 +791,6 @@ requirements of the license of GCC. Add the overload. - 844: - complex pow return type is ambiguous - - In C++11 mode, remove the pow(complex<T>, int) signature. - - 853: to_string needs updating with zero and one diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex index 7f100a0420d..58edb4f54dd 100644 --- a/libstdc++-v3/include/std/complex +++ b/libstdc++-v3/include/std/complex @@ -88,11 +88,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template complex<_Tp> log(const complex<_Tp>&); /// Return complex base 10 logarithm of @a z. template complex<_Tp> log10(const complex<_Tp>&); -#if __cplusplus < 201103L - // DR 844. /// Return @a x to the @a y'th power. template complex<_Tp> pow(const complex<_Tp>&, int); -#endif /// Return @a x to the @a y'th power. template complex<_Tp> pow(const complex<_Tp>&, const _Tp&); /// Return @a x to the @a y'th power. @@ -955,7 +952,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // 26.2.8/9 pow(__x, __y): Returns the complex power base of __x // raised to the __y-th power. The branch // cut is on the negative axis. -#if __cplusplus < 201103L template complex<_Tp> __complex_pow_unsigned(complex<_Tp> __x, unsigned __n) @@ -972,8 +968,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __y; } - // _GLIBCXX_RESOLVE_LIB_DEFECTS + // In C++11 mode we used to implement the resolution of // DR 844. complex pow return type is ambiguous. + // thus the following overload was disabled in that mode. However, doing + // that causes all sorts of issues, see, for example: + // http://gcc.gnu.org/ml/libstdc++/2013-01/msg00058.html + // and also PR57974. template inline complex<_Tp> pow(const complex<_Tp>& __z, int __n) @@ -982,7 +982,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ? complex<_Tp>(1) / std::__complex_pow_unsigned(__z, -(unsigned)__n) : std::__complex_pow_unsigned(__z, __n); } -#endif template complex<_Tp> diff --git a/libstdc++-v3/testsuite/26_numerics/complex/dr844.cc b/libstdc++-v3/testsuite/26_numerics/complex/dr844.cc index d38f9569e12..8eb72ec5f9b 100644 --- a/libstdc++-v3/testsuite/26_numerics/complex/dr844.cc +++ b/libstdc++-v3/testsuite/26_numerics/complex/dr844.cc @@ -22,7 +22,11 @@ #include #include +// In C++11 mode we used to implement the resolution of // DR 844. complex pow return type is ambiguous. +// However, doing that causes all sorts of issues, see, for example: +// http://gcc.gnu.org/ml/libstdc++/2013-01/msg00058.html +// and also PR57974. void test01() { bool test __attribute__((unused)) = true; @@ -37,9 +41,7 @@ void test01() const double d1 = 1.0; const long double ld1 = 1.0l; - check_ret_type(std::pow(cmplx_f_type(f1, f1), i1)); - VERIFY( std::pow(cmplx_f_type(f1, f1), i1) - == std::pow(cmplx_d_type(f1, f1), double(i1)) ); + check_ret_type(std::pow(cmplx_f_type(f1, f1), i1)); check_ret_type(std::pow(cmplx_d_type(d1, d1), i1)); check_ret_type(std::pow(cmplx_ld_type(ld1, ld1), i1)); }