From 2bd8e92c33aabe2b9a8fbda04c5f15ba8ae21aec Mon Sep 17 00:00:00 2001
From: Chris Jefferson <chris@bubblescope.net>
Date: Thu, 29 Sep 2005 17:42:42 +0000
Subject: [PATCH] re PR libstdc++/23978 (tr1::tie doesn't work with std::pair)

2005-09-29  Chris Jefferson <chris@bubblescope.net>

	PR libstdc++/23978
	* include/tr1/functional (ref, cref): Make inline.
	* include/tr1/tuple_iterate.h (tuple): Add operator=(std::pair).
	(tie): Correct formatting.
	(make_tuple): Make inline.
	* testsuite/tr1/6_containers/tuple/creation_functions/23978.cc: New.

From-SVN: r104784
---
 libstdc++-v3/ChangeLog                        |  9 ++++
 libstdc++-v3/include/tr1/functional           | 10 ++--
 libstdc++-v3/include/tr1/tuple_iterate.h      | 23 +++++----
 .../tuple/creation_functions/23978.cc         | 47 +++++++++++++++++++
 4 files changed, 77 insertions(+), 12 deletions(-)
 create mode 100644 libstdc++-v3/testsuite/tr1/6_containers/tuple/creation_functions/23978.cc

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 59624138ed46..dc5da153bd58 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,12 @@
+2005-09-29  Chris Jefferson <chris@bubblescope.net>
+
+	PR libstdc++/23978
+	* include/tr1/functional (ref, cref): Make inline.
+	* include/tr1/tuple_iterate.h (tuple): Add operator=(std::pair).
+	(tie): Correct formatting.
+	(make_tuple): Make inline.
+	* testsuite/tr1/6_containers/tuple/creation_functions/23978.cc: New.
+
 2005-09-25  Benjamin Kosnik  <bkoz@redhat.com>
 	    Eric Botcazou  <ebotcazou@libertysurf.fr>
 
diff --git a/libstdc++-v3/include/tr1/functional b/libstdc++-v3/include/tr1/functional
index 6b197d837005..76eb87a0bb54 100644
--- a/libstdc++-v3/include/tr1/functional
+++ b/libstdc++-v3/include/tr1/functional
@@ -372,22 +372,24 @@ namespace tr1
 
   // Denotes a reference should be taken to a variable.
   template<typename _Tp>
-    reference_wrapper<_Tp>
+    inline reference_wrapper<_Tp>
     ref(_Tp& __t)
     { return reference_wrapper<_Tp>(__t); }
 
   // Denotes a const reference should be taken to a variable.
   template<typename _Tp>
-    reference_wrapper<const _Tp>
+    inline reference_wrapper<const _Tp>
     cref(const _Tp& __t)
     { return reference_wrapper<const _Tp>(__t); }
 
   template<typename _Tp>
-    reference_wrapper<_Tp> ref(reference_wrapper<_Tp> __t)
+    inline reference_wrapper<_Tp>
+    ref(reference_wrapper<_Tp> __t)
     { return ref(__t.get()); }
 
   template<typename _Tp>
-    reference_wrapper<const _Tp> cref(reference_wrapper<_Tp> __t)
+    inline reference_wrapper<const _Tp>
+    cref(reference_wrapper<_Tp> __t)
     { return cref(__t.get()); }
 
    template<typename _Tp, bool>
diff --git a/libstdc++-v3/include/tr1/tuple_iterate.h b/libstdc++-v3/include/tr1/tuple_iterate.h
index dbfa42b74910..2bf7d3e22d58 100644
--- a/libstdc++-v3/include/tr1/tuple_iterate.h
+++ b/libstdc++-v3/include/tr1/tuple_iterate.h
@@ -53,11 +53,18 @@ template<_GLIBCXX_TEMPLATE_PARAMS>
     { }
 
 #if _GLIBCXX_NUM_ARGS == 2
-template<class _U1, class _U2>
-        tuple(const std::pair<_U1, _U2>& __u):
-           _M_arg1(__u.first), _M_arg2(__u.second)
-        { }
+    template<typename _U1, typename _U2>
+      tuple(const std::pair<_U1, _U2>& __u) :
+      _M_arg1(__u.first), _M_arg2(__u.second)
+      { }
 
+    template<typename _U1, typename _U2>
+      tuple&
+      operator=(const std::pair<_U1, _U2>& __u)
+      { 
+	_M_arg1 = __u.first;
+	_M_arg2 = __u.second;
+      }
 #endif
 
 #if _GLIBCXX_NUM_ARGS > 0
@@ -137,14 +144,14 @@ tuple<>
 inline make_tuple()
 { return tuple<>(); }
 
-inline tuple<>
-tie()
+tuple<>
+inline tie()
 { return tuple<>(); }
 #else
 
 template<_GLIBCXX_TEMPLATE_PARAMS>
   typename __stripped_tuple_type<_GLIBCXX_TEMPLATE_ARGS>::__type
-  make_tuple(_GLIBCXX_PARAMS)
+  inline make_tuple(_GLIBCXX_PARAMS)
   {
     return typename __stripped_tuple_type<_GLIBCXX_TEMPLATE_ARGS>::
       __type(_GLIBCXX_ARGS);
@@ -152,7 +159,7 @@ template<_GLIBCXX_TEMPLATE_PARAMS>
 
 template<_GLIBCXX_TEMPLATE_PARAMS>
   tuple<_GLIBCXX_REF_TEMPLATE_ARGS>
-  tie(_GLIBCXX_REF_PARAMS)
+  inline tie(_GLIBCXX_REF_PARAMS)
   { return make_tuple(_GLIBCXX_REF_WRAP_PARAMS); }
 #endif
 
diff --git a/libstdc++-v3/testsuite/tr1/6_containers/tuple/creation_functions/23978.cc b/libstdc++-v3/testsuite/tr1/6_containers/tuple/creation_functions/23978.cc
new file mode 100644
index 000000000000..2c94f3314dd7
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/6_containers/tuple/creation_functions/23978.cc
@@ -0,0 +1,47 @@
+// 2005-09-29  Chris Jefferson  <chris@bubblescope.net>
+//
+// Copyright (C) 2005 Free Software Foundation, Inc.
+//
+// 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.
+
+// Tuple
+
+#include <tr1/tuple>
+#include <tr1/utility>
+#include <testsuite_hooks.h>
+
+using namespace std;
+using namespace tr1;
+
+// libstdc++/23978
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  pair<int, int> p(1, 2);
+  int x = 0;
+  int y = 0;
+  tie(x, y) = p;
+  VERIFY( x == 1 && y == 2 );
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
-- 
GitLab