diff options
| author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-12 13:34:47 +0000 |
|---|---|---|
| committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-12 13:34:47 +0000 |
| commit | 8d82d081d2c710ca34c238b72cc19692fdd4e6fd (patch) | |
| tree | 42cb3c1e9118a2aeade3f5161820851dc2c365bf | |
| parent | 47ec0ad9a5ffb67eacdf0f691747bbc8414e4d56 (diff) | |
| download | ppe42-gcc-8d82d081d2c710ca34c238b72cc19692fdd4e6fd.tar.gz ppe42-gcc-8d82d081d2c710ca34c238b72cc19692fdd4e6fd.zip | |
2007-01-12 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/30416 (continued)
* include/std/valarray (valarray<>::shift, valarray<>::cshift):
Allways return the same variable, thus facilitating NRVO.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120722 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | libstdc++-v3/ChangeLog | 6 | ||||
| -rw-r--r-- | libstdc++-v3/include/std/valarray | 30 |
2 files changed, 25 insertions, 11 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 6bfbcc1db40..4efc40cda95 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,11 @@ 2007-01-12 Paolo Carlini <pcarlini@suse.de> + PR libstdc++/30416 (continued) + * include/std/valarray (valarray<>::shift, valarray<>::cshift): + Allways return the same variable, thus facilitating NRVO. + +2007-01-12 Paolo Carlini <pcarlini@suse.de> + PR libstdc++/30416 * include/std/valarray (valarray<>::shift, valarray<>::cshift): Do not segfault when |n| > size. diff --git a/libstdc++-v3/include/std/valarray b/libstdc++-v3/include/std/valarray index 95f27012eaf..6c828b68517 100644 --- a/libstdc++-v3/include/std/valarray +++ b/libstdc++-v3/include/std/valarray @@ -782,14 +782,18 @@ _GLIBCXX_BEGIN_NAMESPACE(std) inline valarray<_Tp> valarray<_Tp>::shift(int __n) const { - if (_M_size == 0 || __n == 0) - return *this; - valarray<_Tp> __ret; + + if (_M_size == 0) + return __ret; + _Tp* __restrict__ __tmp_M_data = std::__valarray_get_storage<_Tp>(_M_size); - if (__n > 0) // shift left + if (__n == 0) + std::__valarray_copy_construct(_M_data, + _M_data + _M_size, __tmp_M_data); + else if (__n > 0) // shift left { if (size_t(__n) > _M_size) __n = _M_size; @@ -799,7 +803,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) std::__valarray_default_construct(__tmp_M_data + _M_size - __n, __tmp_M_data + _M_size); } - else // shift right + else // shift right { if (size_t(-__n) > _M_size) __n = -_M_size; @@ -819,14 +823,18 @@ _GLIBCXX_BEGIN_NAMESPACE(std) inline valarray<_Tp> valarray<_Tp>::cshift(int __n) const { - if (_M_size == 0 || __n == 0) - return *this; - valarray<_Tp> __ret; + + if (_M_size == 0) + return __ret; + _Tp* __restrict__ __tmp_M_data = std::__valarray_get_storage<_Tp>(_M_size); - - if (__n > 0) // cshift left + + if (__n == 0) + std::__valarray_copy_construct(_M_data, + _M_data + _M_size, __tmp_M_data); + else if (__n > 0) // cshift left { if (size_t(__n) > _M_size) __n = __n % _M_size; @@ -836,7 +844,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) std::__valarray_copy_construct(_M_data + __n, _M_data + _M_size, __tmp_M_data); } - else // cshift right + else // cshift right { if (size_t(-__n) > _M_size) __n = -(-__n % _M_size); |

