From 6085dc49ba779eaa3979c34935e1392bf1ce5fad Mon Sep 17 00:00:00 2001
From: Paolo Carlini <pcarlini@suse.de>
Date: Sun, 15 Jan 2006 18:04:31 +0000
Subject: [PATCH] re PR libstdc++/25626 (Valarray vs non-POD)

2006-01-15  Paolo Carlini  <pcarlini@suse.de>
	    Gabriel Dos Reis  <gdr@integrable-solutions.net>

	PR libstdc++/25626
	* include/std/std_valarray.h (valarray(const slice_array<>&),
	valarray(const gslice_array<>&), valarray(const mask_array<>&),
	valarray(const indirect_array<>&), valarray(const _Expr<>&)):
	Forward to __valarray_copy_construct, not __valarray_copy.
	* include/bits/valarray_array.h
	(__valarray_copy_construct(_Array<>, _Array<>, _Array<>, size_t),
	__valarray_copy_construct(_Array<>, size_t, size_t, _Array<>)):
	New.

Co-Authored-By: Gabriel Dos Reis <gdr@integrable-solutions.net>

From-SVN: r109726
---
 libstdc++-v3/ChangeLog                     | 13 +++++++++++++
 libstdc++-v3/include/bits/valarray_array.h | 18 +++++++++++++++++-
 libstdc++-v3/include/std/std_valarray.h    | 12 ++++++------
 3 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 93b2e0a11f8d..285e04524aca 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,16 @@
+2006-01-15  Paolo Carlini  <pcarlini@suse.de>
+	    Gabriel Dos Reis  <gdr@integrable-solutions.net>
+
+	PR libstdc++/25626
+	* include/std/std_valarray.h (valarray(const slice_array<>&),
+	valarray(const gslice_array<>&), valarray(const mask_array<>&),
+	valarray(const indirect_array<>&), valarray(const _Expr<>&)):
+	Forward to __valarray_copy_construct, not __valarray_copy.
+	* include/bits/valarray_array.h
+	(__valarray_copy_construct(_Array<>, _Array<>, _Array<>, size_t),
+	__valarray_copy_construct(_Array<>, size_t, size_t, _Array<>)):
+	New.
+
 2006-01-15  Paolo Carlini  <pcarlini@suse.de>
 
 	* testsuite/tr1/8_c_compatibility/complex/overloads_int.cc:
diff --git a/libstdc++-v3/include/bits/valarray_array.h b/libstdc++-v3/include/bits/valarray_array.h
index 490384fdcc47..06924fe3ed52 100644
--- a/libstdc++-v3/include/bits/valarray_array.h
+++ b/libstdc++-v3/include/bits/valarray_array.h
@@ -1,6 +1,6 @@
 // The template and inlines for the -*- C++ -*- internal _Array helper class.
 
-// Copyright (C) 1997, 1998, 1999, 2000, 2003, 2004, 2005
+// Copyright (C) 1997, 1998, 1999, 2000, 2003, 2004, 2005, 2006
 //  Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
@@ -428,6 +428,22 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
       _Tp* const __restrict__ _M_data;
     };
 
+
+  // Copy-construct plain array __b[<__n>] from indexed array __a[__i[<__n>]]
+  template<typename _Tp>
+    inline void
+    __valarray_copy_construct(_Array<_Tp> __a, _Array<size_t> __i,
+			      _Array<_Tp> __b, size_t __n)
+    { std::__valarray_copy_construct(__a._M_data, __i._M_data,
+				     __b._M_data, __n); }
+
+  // Copy-construct plain array __b[<__n>] from strided array __a[<__n : __s>]
+  template<typename _Tp>
+    inline void
+    __valarray_copy_construct(_Array<_Tp> __a, size_t __n, size_t __s,
+			      _Array<_Tp> __b)
+    { std::__valarray_copy_construct(__a._M_data, __n, __s, __b._M_data); }
+
   template<typename _Tp>
     inline void
     __valarray_fill (_Array<_Tp> __a, size_t __n, const _Tp& __t)
diff --git a/libstdc++-v3/include/std/std_valarray.h b/libstdc++-v3/include/std/std_valarray.h
index 82b2fb891a7e..ada7aea40626 100644
--- a/libstdc++-v3/include/std/std_valarray.h
+++ b/libstdc++-v3/include/std/std_valarray.h
@@ -1,6 +1,6 @@
 // The template and inlines for the -*- C++ -*- valarray class.
 
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006
 // Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
@@ -583,7 +583,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
     valarray<_Tp>::valarray(const slice_array<_Tp>& __sa)
     : _M_size(__sa._M_sz), _M_data(__valarray_get_storage<_Tp>(__sa._M_sz))
     {
-      std::__valarray_copy
+      std::__valarray_copy_construct
 	(__sa._M_array, __sa._M_sz, __sa._M_stride, _Array<_Tp>(_M_data));
     }
 
@@ -593,7 +593,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
     : _M_size(__ga._M_index.size()),
       _M_data(__valarray_get_storage<_Tp>(_M_size))
     {
-      std::__valarray_copy
+      std::__valarray_copy_construct
 	(__ga._M_array, _Array<size_t>(__ga._M_index),
 	 _Array<_Tp>(_M_data), _M_size);
     }
@@ -603,7 +603,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
     valarray<_Tp>::valarray(const mask_array<_Tp>& __ma)
     : _M_size(__ma._M_sz), _M_data(__valarray_get_storage<_Tp>(__ma._M_sz))
     {
-      std::__valarray_copy
+      std::__valarray_copy_construct
 	(__ma._M_array, __ma._M_mask, _Array<_Tp>(_M_data), _M_size);
     }
 
@@ -612,7 +612,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
     valarray<_Tp>::valarray(const indirect_array<_Tp>& __ia)
     : _M_size(__ia._M_sz), _M_data(__valarray_get_storage<_Tp>(__ia._M_sz))
     {
-      std::__valarray_copy
+      std::__valarray_copy_construct
 	(__ia._M_array, __ia._M_index, _Array<_Tp>(_M_data), _M_size);
     }
 
@@ -620,7 +620,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
     inline
     valarray<_Tp>::valarray(const _Expr<_Dom, _Tp>& __e)
     : _M_size(__e.size()), _M_data(__valarray_get_storage<_Tp>(_M_size))
-    { std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data)); }
+    { std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data)); }
 
   template<typename _Tp>
     inline
-- 
GitLab