Make flag type configurable by the compiler

llvm-svn: 115614
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 772699070ee135ad98c65022f4eb3c3cd2ab767a
diff --git a/include/atomic b/include/atomic
index e55d092..a288120 100644
--- a/include/atomic
+++ b/include/atomic
@@ -12376,6 +12376,10 @@
 
 // flag type and operations
 
+#if !__has_feature(__atomic_flag)
+    typedef bool __atomic_flag__;
+#endif
+
 struct atomic_flag;
 
 bool atomic_flag_test_and_set(volatile atomic_flag*);
@@ -12389,7 +12393,7 @@
 
 typedef struct _LIBCPP_VISIBLE atomic_flag
 {
-    bool __flg_;
+    __atomic_flag__ __flg_;
 
     _LIBCPP_INLINE_VISIBILITY
     bool test_and_set() volatile
@@ -12441,7 +12445,8 @@
 bool
 atomic_flag_test_and_set(volatile atomic_flag* __f)
 {
-    return __choose_exchange_seq_cst(&__f->__flg_, true);
+    return __choose_exchange_seq_cst(&__f->__flg_, __atomic_flag__(true))
+            == __atomic_flag__(true);
 }
 
 inline _LIBCPP_INLINE_VISIBILITY
@@ -12458,17 +12463,23 @@
     switch (__o)
     {
     case memory_order_relaxed:
-        return __choose_exchange_relaxed(&__f->__flg_, true);
+        return __choose_exchange_relaxed(&__f->__flg_, __atomic_flag__(true))
+            == __atomic_flag__(true);
     case memory_order_consume:
-        return __choose_exchange_consume(&__f->__flg_, true);
+        return __choose_exchange_consume(&__f->__flg_, __atomic_flag__(true))
+            == __atomic_flag__(true);
     case memory_order_acquire:
-        return __choose_exchange_acquire(&__f->__flg_, true);
+        return __choose_exchange_acquire(&__f->__flg_, __atomic_flag__(true))
+            == __atomic_flag__(true);
     case memory_order_release:
-        return __choose_exchange_release(&__f->__flg_, true);
+        return __choose_exchange_release(&__f->__flg_, __atomic_flag__(true))
+            == __atomic_flag__(true);
     case memory_order_acq_rel:
-        return __choose_exchange_acq_rel(&__f->__flg_, true);
+        return __choose_exchange_acq_rel(&__f->__flg_, __atomic_flag__(true))
+            == __atomic_flag__(true);
     case memory_order_seq_cst:
-        return __choose_exchange_seq_cst(&__f->__flg_, true);
+        return __choose_exchange_seq_cst(&__f->__flg_, __atomic_flag__(true))
+            == __atomic_flag__(true);
     }
 }
 
@@ -12484,7 +12495,7 @@
 void
 atomic_flag_clear(volatile atomic_flag* __f)
 {
-    return __choose_store_seq_cst(&__f->__flg_, false);
+    __choose_store_seq_cst(&__f->__flg_, __atomic_flag__(false));
 }
 
 inline _LIBCPP_INLINE_VISIBILITY
@@ -12501,13 +12512,13 @@
     switch (__o)
     {
     case memory_order_relaxed:
-        __choose_store_relaxed(&__f->__flg_, false);
+        __choose_store_relaxed(&__f->__flg_, __atomic_flag__(false));
         break;
     case memory_order_release:
-        __choose_store_release(&__f->__flg_, false);
+        __choose_store_release(&__f->__flg_, __atomic_flag__(false));
         break;
     case memory_order_seq_cst:
-        __choose_store_seq_cst(&__f->__flg_, false);
+        __choose_store_seq_cst(&__f->__flg_, __atomic_flag__(false));
         break;
     }
 }