summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-12 13:34:47 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-12 13:34:47 +0000
commit8d82d081d2c710ca34c238b72cc19692fdd4e6fd (patch)
tree42cb3c1e9118a2aeade3f5161820851dc2c365bf
parent47ec0ad9a5ffb67eacdf0f691747bbc8414e4d56 (diff)
downloadppe42-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/ChangeLog6
-rw-r--r--libstdc++-v3/include/std/valarray30
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);
OpenPOWER on IntegriCloud