[PATCH] PR68925 don't use thread_local static for stateless object

Jonathan Wakely jwakely@redhat.com
Wed Jan 18 17:21:00 GMT 2017


	PR libstdc++/68925
	* include/experimental/random (randint): Use temporary instead of
	thread_local static.

Tested powerpc64le-linux, committed to trunk.

-------------- next part --------------
commit 71544b3d1abd1c9a2d47ef664ce696b750232e0f
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Wed Jan 18 17:16:10 2017 +0000

    PR68925 don't use thread_local static for stateless object
    
    	PR libstdc++/68925
    	* include/experimental/random (randint): Use temporary instead of
    	thread_local static.

diff --git a/libstdc++-v3/include/experimental/random b/libstdc++-v3/include/experimental/random
index 9d5415e..e28df5d 100644
--- a/libstdc++-v3/include/experimental/random
+++ b/libstdc++-v3/include/experimental/random
@@ -54,8 +54,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       static_assert(is_integral<_IntType>::value && sizeof(_IntType) > 1,
 		    "argument must be an integer type");
       using _Dist = std::uniform_int_distribution<_IntType>;
-      static thread_local _Dist __dist;
-      return __dist(_S_randint_engine(), typename _Dist::param_type{__a, __b});
+      // This relies on the fact our uniform_int_distribution is stateless,
+      // otherwise we'd need a static thread_local _Dist and pass it
+      // _Dist::param_type{__a, __b}.
+      return _Dist(__a, __b)(_S_randint_engine());
     }
 
   inline void


More information about the Gcc-patches mailing list