https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86846

--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> ---
This should do it:

--- a/libstdc++-v3/src/c++17/memory_resource.cc
+++ b/libstdc++-v3/src/c++17/memory_resource.cc
@@ -25,6 +25,7 @@
 #include <memory_resource>
 #include <atomic>
 #include <new>
+#include <bits/std_mutex.h>

 namespace std _GLIBCXX_VISIBILITY(default)
 {
@@ -81,7 +82,31 @@ namespace pmr

     constant_init<newdel_res_t> newdel_res{};
     constant_init<null_res_t> null_res{};
+#if ATOMIC_POINTER_LOCK_FREE == 2
     constant_init<atomic<memory_resource*>> default_res{&newdel_res.obj};
+#else
+    struct locking_atomic
+    {
+      constexpr locking_atomic(memory_resource* r) : val(r) { }
+      mutex mx;
+      memory_resource* val;
+
+      memory_resource* load()
+      {
+       lock_guard<mutex> lock(mx);
+       return val;
+      }
+
+      memory_resource* exchange(memory_resource* r)
+      {
+       lock_guard<mutex> lock(mx);
+       auto prev = val;
+       val = r;
+       return prev;
+      }
+    };
+    constant_init<locking_atomic> default_res{&newdel_res.obj};
+#endif
   } // namespace

   memory_resource*

Reply via email to