Patchwork fix libstdc++/55861

login
register
mail settings
Submitter Jonathan Wakely
Date Jan. 19, 2013, 11:43 p.m.
Message ID <CAH6eHdSVF0ZJa=_c8GwfKNDBCVR84zzBKwRFjoRqmVHN9EBwqQ@mail.gmail.com>
Download mbox | patch
Permalink /patch/213889/
State New
Headers show

Comments

Jonathan Wakely - Jan. 19, 2013, 11:43 p.m.
PR libstdc++/55861
        * include/std/future (_State_base::_S_check(const shared_ptr<T>&)):
        Fix return type.
        (__basic_future::_M_get_result()): Const qualify.
        (shared_future::get()): Likewise.
        * testsuite/30_threads/shared_future/members/get.cc: Use const
        objects.

Tested x86_64-linux, committed to trunk.
commit 0b1ce87e22ebcefbc19c9b26d58a1cd2a2654297
Author: Jonathan Wakely <jwakely.gcc@gmail.com>
Date:   Sat Jan 19 21:02:13 2013 +0000

    	PR libstdc++/55861
    	* include/std/future (_State_base::_S_check(const shared_ptr<T>&)):
    	Fix return type.
    	(__basic_future::_M_get_result()): Const qualify.
    	(shared_future::get()): Likewise.
    	* testsuite/30_threads/shared_future/members/get.cc: Use const
    	objects.

Patch

diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future
index 2ecf438..6cccd3d 100644
--- a/libstdc++-v3/include/std/future
+++ b/libstdc++-v3/include/std/future
@@ -1,6 +1,6 @@ 
 // <future> -*- C++ -*-
 
-// Copyright (C) 2009-2012 Free Software Foundation, Inc.
+// Copyright (C) 2009-2013 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
@@ -447,7 +447,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __setter(promise<void>* __prom);
 
       template<typename _Tp>
-        static bool
+        static void
         _S_check(const shared_ptr<_Tp>& __p)
         {
           if (!static_cast<bool>(__p))
@@ -583,7 +583,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     protected:
       /// Wait for the state to be ready and rethrow any stored exception
       __result_type
-      _M_get_result()
+      _M_get_result() const
       {
         _State_base::_S_check(_M_state);
         _Result_base& __res = _M_state->wait();
@@ -794,12 +794,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       /// Retrieving the value
       const _Res&
-      get()
-      {
-	typename _Base_type::__result_type __r = this->_M_get_result();
-	_Res& __rs(__r._M_value());
-	return __rs;
-      }
+      get() const { return this->_M_get_result()._M_value(); }
     };
 
   /// Partial specialization for shared_future<R&>
@@ -838,7 +833,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       /// Retrieving the value
       _Res&
-      get() { return this->_M_get_result()._M_get(); }
+      get() const { return this->_M_get_result()._M_get(); }
     };
 
   /// Explicit specialization for shared_future<void>
@@ -877,7 +872,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       // Retrieving the value
       void
-      get() { this->_M_get_result(); }
+      get() const { this->_M_get_result(); }
     };
 
   // Now we can define the protected __basic_future constructors.
diff --git a/libstdc++-v3/testsuite/30_threads/shared_future/members/get.cc b/libstdc++-v3/testsuite/30_threads/shared_future/members/get.cc
index 4c8ef82..9d2628d 100644
--- a/libstdc++-v3/testsuite/30_threads/shared_future/members/get.cc
+++ b/libstdc++-v3/testsuite/30_threads/shared_future/members/get.cc
@@ -6,7 +6,7 @@ 
 // { dg-require-gthreads "" }
 // { dg-require-atomic-builtins "" }
 
-// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+// Copyright (C) 2009-2013 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
@@ -34,7 +34,7 @@  void test01()
   bool test __attribute__((unused)) = true;
 
   std::promise<int> p1;
-  std::shared_future<int> f1(p1.get_future());
+  const std::shared_future<int> f1(p1.get_future());
   std::shared_future<int> f2(f1);
 
   p1.set_value(value);
@@ -47,7 +47,7 @@  void test02()
   bool test __attribute__((unused)) = true;
 
   std::promise<int&> p1;
-  std::shared_future<int&> f1(p1.get_future());
+  const std::shared_future<int&> f1(p1.get_future());
   std::shared_future<int&> f2(f1);
 
   p1.set_value(value);
@@ -60,7 +60,7 @@  void test03()
   bool test __attribute__((unused)) = true;
 
   std::promise<void> p1;
-  std::shared_future<void> f1(p1.get_future());
+  const std::shared_future<void> f1(p1.get_future());
   std::shared_future<void> f2(f1);
 
   p1.set_value();