Hi mclow.lists,

There are many places where libc++ want to use <atomic> internally in C++03 
code. Unfortunately `<atomic>` currently only supports C++11 and later. This 
patch extends <atomic> so that everything except `ATOMIC_VAR_INIT` and 
`ATOMIC_FLAG_INIT` can be used in c++03 code.

This patch introduces the macros:
* `_LIBCPP_HAS_C11_ATOMICS`: Defined if `__has_extension(c_atomic)` is true.
* `_LIBCPP_HAS_CXX_ATOMICS`: Defined if we have C11 atomics from clang or the 
`__atomic_*` builtin family from GCC and libc++ is configured for threads. If 
`_LIBCPP_HAS_CXX_ATOMICS` is defined then the `<atomic>` header should be safe 
to include.


Other Misc changes:
* `__gcc_atomic_t` default constructs the stored value. This make it perform 
the same as `_Atomic`.
* `constexpr` -> `_LIBCPP_CONSTEXPR`
* `noexcept` -> `TEST_NOEXCEPT` in the tests.
* re-implement `std::atomic::is_lock_free()` to prevent needing `libatomic` 
with GCC.

http://reviews.llvm.org/D10046

Files:
  include/__config
  include/atomic
  include/ios
  include/memory
  src/ios.cpp
  src/memory.cpp
  test/libcxx/atomics/init_macros.pass.cpp
  test/libcxx/atomics/libcpp-has-no-threads.fail.cpp
  test/libcxx/atomics/libcpp-has-no-threads.pass.cpp
  test/libcxx/atomics/version.pass.cpp
  test/std/atomics/atomics.flag/atomic_flag_clear.pass.cpp
  test/std/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp
  test/std/atomics/atomics.flag/clear.pass.cpp
  test/std/atomics/atomics.flag/init.pass.cpp
  test/std/atomics/atomics.types.generic/trivially_copyable.fail.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_init.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit.pass.cpp
  
test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init.pass.cpp
  test/std/atomics/libcpp-has-no-threads.fail.cpp
  test/std/atomics/libcpp-has-no-threads.pass.cpp
  test/std/atomics/version.pass.cpp
  
test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong.pass.cpp
  
test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong_explicit.pass.cpp
  
test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak.pass.cpp
  
test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak_explicit.pass.cpp
  
test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange.pass.cpp
  
test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange_explicit.pass.cpp
  
test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_is_lock_free.pass.cpp
  
test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load.pass.cpp
  
test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load_explicit.pass.cpp
  
test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store.pass.cpp
  
test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store_explicit.pass.cpp

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: include/__config
===================================================================
--- include/__config
+++ include/__config
@@ -318,6 +318,10 @@
 #  define _LIBCPP_HAS_IS_BASE_OF
 #endif
 
+#if __has_extension(c_atomic)
+#define _LIBCPP_HAS_C11_ATOMICS
+#endif
+
 // Objective-C++ features (opt-in)
 #if __has_feature(objc_arc)
 #define _LIBCPP_HAS_OBJC_ARC
@@ -751,4 +755,9 @@
 #define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
 #endif
 
+#if (defined(_LIBCPP_HAS_C11_ATOMICS) || _GNUC_VER >= 407) \
+  && !defined(_LIBCPP_HAS_NO_THREADS)
+#define _LIBCPP_HAS_CXX_ATOMICS
+#endif
+
 #endif  // _LIBCPP_CONFIG
Index: include/atomic
===================================================================
--- include/atomic
+++ include/atomic
@@ -537,11 +537,13 @@
 #error <atomic> is not supported on this single threaded system
 #else // !_LIBCPP_HAS_NO_THREADS
 
+#ifndef _LIBCPP_HAS_CXX_ATOMICS
+#error <atomic> is not implemented
+#endif
+
 _LIBCPP_BEGIN_NAMESPACE_STD
 
-#if !__has_feature(cxx_atomic) && _GNUC_VER < 407
-#error <atomic> is not implemented
-#else
+#ifdef _LIBCPP_HAS_CXX_ATOMICS
 
 typedef enum memory_order
 {
@@ -549,11 +551,11 @@
     memory_order_release, memory_order_acq_rel, memory_order_seq_cst
 } memory_order;
 
-#if _GNUC_VER >= 407
+#if !defined(_LIBCPP_HAS_C11_ATOMICS)
 namespace __gcc_atomic {
 template <typename _Tp>
 struct __gcc_atomic_t {
-  __gcc_atomic_t() _NOEXCEPT {}
+  __gcc_atomic_t() _NOEXCEPT : __a_value() {}
   explicit __gcc_atomic_t(_Tp value) _NOEXCEPT : __a_value(value) {}
   _Tp __a_value;
 };
@@ -573,7 +575,7 @@
       sizeof(__test_atomic_assignable<_Tp, _Td>(1)) == sizeof(char);
 };
 
-static inline constexpr int __to_gcc_order(memory_order __order) {
+static inline _LIBCPP_CONSTEXPR int __to_gcc_order(memory_order __order) {
   // Avoid switch statement to make this a constexpr.
   return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
          (__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
@@ -583,7 +585,7 @@
               __ATOMIC_CONSUME))));
 }
 
-static inline constexpr int __to_gcc_failure_order(memory_order __order) {
+static inline _LIBCPP_CONSTEXPR int __to_gcc_failure_order(memory_order __order) {
   // Avoid switch statement to make this a constexpr.
   return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
          (__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
@@ -808,7 +810,7 @@
   return __atomic_fetch_xor(&__a->__a_value, __pattern,
                             __gcc_atomic::__to_gcc_order(__order));
 }
-#endif // _GNUC_VER >= 407
+#endif // !defined(_LIBCPP_HAS_NO_C11_ATOMICS)
 
 template <class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
@@ -827,10 +829,20 @@
 
     _LIBCPP_INLINE_VISIBILITY
     bool is_lock_free() const volatile _NOEXCEPT
-        {return __c11_atomic_is_lock_free(sizeof(_Tp));}
+    {
+#ifdef _LIBCPP_HAS_C11_ATOMICS
+      return __c11_atomic_is_lock_free(sizeof(_Tp));
+#else
+      return __atomic_is_lock_free(sizeof(_Tp), 0);
+#endif
+    }
+
     _LIBCPP_INLINE_VISIBILITY
     bool is_lock_free() const _NOEXCEPT
-        {return __c11_atomic_is_lock_free(sizeof(_Tp));}
+    {
+      return static_cast<__atomic_base const volatile*>(this)->is_lock_free();
+    }
+
     _LIBCPP_INLINE_VISIBILITY
     void store(_Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
         {__c11_atomic_store(&__a_, __d, __m);}
@@ -1773,8 +1785,10 @@
 typedef atomic<intmax_t>  atomic_intmax_t;
 typedef atomic<uintmax_t> atomic_uintmax_t;
 
+#if _LIBCPP_STD_VER >= 11
 #define ATOMIC_FLAG_INIT {false}
 #define ATOMIC_VAR_INIT(__v) {__v}
+#endif
 
 // lock-free property
 
@@ -1789,10 +1803,10 @@
 #define ATOMIC_LLONG_LOCK_FREE     __GCC_ATOMIC_LLONG_LOCK_FREE
 #define ATOMIC_POINTER_LOCK_FREE   __GCC_ATOMIC_POINTER_LOCK_FREE
 
-#endif  //  !__has_feature(cxx_atomic)
+#endif  //  _LIBCPP_HAS_C11_ATOMICS
 
 _LIBCPP_END_NAMESPACE_STD
 
-#endif  // !_LIBCPP_HAS_NO_THREADS
+#endif // _LIBCPP_HAS_CXX_ATOMICS
 
 #endif  // _LIBCPP_ATOMIC
Index: include/ios
===================================================================
--- include/ios
+++ include/ios
@@ -216,7 +216,7 @@
 #include <__locale>
 #include <system_error>
 
-#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
+#ifdef _LIBCPP_HAS_CXX_ATOMICS
 #include <atomic>     // for __xindex_
 #endif
 
@@ -367,7 +367,7 @@
     int*            __index_;
     size_t          __event_size_;
     size_t          __event_cap_;
-#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
+#ifdef _LIBCPP_HAS_CXX_ATOMICS
     static atomic<int> __xindex_;
 #else
     static int      __xindex_;
Index: include/memory
===================================================================
--- include/memory
+++ include/memory
@@ -610,7 +610,7 @@
     #include <cassert>
 #endif
 
-#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
+#ifdef _LIBCPP_HAS_CXX_ATOMICS
 #  include <atomic>
 #endif
 
@@ -5332,7 +5332,7 @@
 basic_ostream<_CharT, _Traits>&
 operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p);
 
-#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
+#ifdef _LIBCPP_HAS_CXX_ATOMICS
 
 class _LIBCPP_TYPE_VIS __sp_mut
 {
@@ -5458,7 +5458,7 @@
     return atomic_compare_exchange_weak(__p, __v, __w);
 }
 
-#endif  // __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
+#endif  // defined(_LIBCPP_HAS_CXX_ATOMICS)
 
 //enum class
 struct _LIBCPP_TYPE_VIS pointer_safety
Index: src/ios.cpp
===================================================================
--- src/ios.cpp
+++ src/ios.cpp
@@ -152,7 +152,7 @@
 }
 
 // xalloc
-#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
+#ifdef _LIBCPP_HAS_CXX_ATOMICS
 atomic<int> ios_base::__xindex_ = ATOMIC_VAR_INIT(0);
 #else
 int ios_base::__xindex_ = 0;
Index: src/memory.cpp
===================================================================
--- src/memory.cpp
+++ src/memory.cpp
@@ -121,7 +121,7 @@
 
 #endif  // _LIBCPP_NO_RTTI
 
-#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
+#ifdef _LIBCPP_HAS_CXX_ATOMICS
 
 static const std::size_t __sp_mut_count = 16;
 static pthread_mutex_t mut_back_imp[__sp_mut_count] =
@@ -174,7 +174,7 @@
     return muts[hash<const void*>()(p) & (__sp_mut_count-1)];
 }
 
-#endif // __has_feature(cxx_atomic) && !_LIBCPP_HAS_NO_THREADS
+#endif // _LIBCPP_HAS_CXX_ATOMICS
 
 void
 declare_reachable(void*)
Index: test/libcxx/atomics/init_macros.pass.cpp
===================================================================
--- /dev/null
+++ test/libcxx/atomics/init_macros.pass.cpp
@@ -0,0 +1,40 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+
+// <atomic>
+
+#include <atomic>
+
+#if __cplusplus >= 201103L
+#
+# ifndef ATOMIC_VAR_INIT
+#   error ATOMIC_VAR_INIT should be defined
+# endif
+#
+# ifndef ATOMIC_FLAG_INIT
+#   error ATOMIC_FLAG_INIT should be defined
+# endif
+#
+#else // C++03
+#
+# ifndef ATOMIC_VAR_INIT
+#   error ATOMIC_VAR_INIT should not be defined
+# endif
+#
+# ifndef ATOMIC_FLAG_INIT
+#   error ATOMIC_FLAG_INIT should not be defined
+# endif
+#
+#endif
+
+int main()
+{
+}
Index: test/libcxx/atomics/libcpp-has-no-threads.fail.cpp
===================================================================
--- /dev/null
+++ test/libcxx/atomics/libcpp-has-no-threads.fail.cpp
@@ -0,0 +1,23 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <atomic>
+
+// Test that including <atomic> fails to compile when _LIBCPP_HAS_NO_THREADS
+// is defined.
+
+#ifndef _LIBCPP_HAS_NO_THREADS
+#define _LIBCPP_HAS_NO_THREADS
+#endif
+
+#include <atomic>
+
+int main()
+{
+}
Index: test/libcxx/atomics/libcpp-has-no-threads.pass.cpp
===================================================================
--- /dev/null
+++ test/libcxx/atomics/libcpp-has-no-threads.pass.cpp
@@ -0,0 +1,18 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+// XFAIL: libcpp-has-no-threads
+
+#ifdef _LIBCPP_HAS_NO_THREADS
+#error This should be XFAIL'd for the purpose of detecting that the LIT feature\
+ 'libcpp-has-no-threads' is available iff _LIBCPP_HAS_NO_THREADS is defined
+#endif
+
+int main()
+{
+}
Index: test/libcxx/atomics/version.pass.cpp
===================================================================
--- /dev/null
+++ test/libcxx/atomics/version.pass.cpp
@@ -0,0 +1,22 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+
+// <atomic>
+
+#include <atomic>
+
+#ifndef _LIBCPP_VERSION
+#error _LIBCPP_VERSION not defined
+#endif
+
+int main()
+{
+}
Index: test/std/atomics/atomics.flag/atomic_flag_clear.pass.cpp
===================================================================
--- test/std/atomics/atomics.flag/atomic_flag_clear.pass.cpp
+++ test/std/atomics/atomics.flag/atomic_flag_clear.pass.cpp
@@ -22,13 +22,15 @@
 int main()
 {
     {
-        std::atomic_flag f = ATOMIC_FLAG_INIT;
+        std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         atomic_flag_clear(&f);
         assert(f.test_and_set() == 0);
     }
     {
-        volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
+        volatile std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         atomic_flag_clear(&f);
         assert(f.test_and_set() == 0);
Index: test/std/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp
===================================================================
--- test/std/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp
+++ test/std/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp
@@ -22,37 +22,43 @@
 int main()
 {
     {
-        std::atomic_flag f = ATOMIC_FLAG_INIT;
+        std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         atomic_flag_clear_explicit(&f, std::memory_order_relaxed);
         assert(f.test_and_set() == 0);
     }
     {
-        std::atomic_flag f = ATOMIC_FLAG_INIT;
+        std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         atomic_flag_clear_explicit(&f, std::memory_order_release);
         assert(f.test_and_set() == 0);
     }
     {
-        std::atomic_flag f = ATOMIC_FLAG_INIT;
+        std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         atomic_flag_clear_explicit(&f, std::memory_order_seq_cst);
         assert(f.test_and_set() == 0);
     }
     {
-        volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
+        volatile std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         atomic_flag_clear_explicit(&f, std::memory_order_relaxed);
         assert(f.test_and_set() == 0);
     }
     {
-        volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
+        volatile std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         atomic_flag_clear_explicit(&f, std::memory_order_release);
         assert(f.test_and_set() == 0);
     }
     {
-        volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
+        volatile std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         atomic_flag_clear_explicit(&f, std::memory_order_seq_cst);
         assert(f.test_and_set() == 0);
Index: test/std/atomics/atomics.flag/clear.pass.cpp
===================================================================
--- test/std/atomics/atomics.flag/clear.pass.cpp
+++ test/std/atomics/atomics.flag/clear.pass.cpp
@@ -22,49 +22,57 @@
 int main()
 {
     {
-        std::atomic_flag f = ATOMIC_FLAG_INIT;
+        std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         f.clear();
         assert(f.test_and_set() == 0);
     }
     {
-        std::atomic_flag f = ATOMIC_FLAG_INIT;
+        std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         f.clear(std::memory_order_relaxed);
         assert(f.test_and_set() == 0);
     }
     {
-        std::atomic_flag f = ATOMIC_FLAG_INIT;
+        std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         f.clear(std::memory_order_release);
         assert(f.test_and_set() == 0);
     }
     {
-        std::atomic_flag f = ATOMIC_FLAG_INIT;
+        std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         f.clear(std::memory_order_seq_cst);
         assert(f.test_and_set() == 0);
     }
     {
-        volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
+        volatile std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         f.clear();
         assert(f.test_and_set() == 0);
     }
     {
-        volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
+        volatile std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         f.clear(std::memory_order_relaxed);
         assert(f.test_and_set() == 0);
     }
     {
-        volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
+        volatile std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         f.clear(std::memory_order_release);
         assert(f.test_and_set() == 0);
     }
     {
-        volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
+        volatile std::atomic_flag f;
+        f.clear();
         f.test_and_set();
         f.clear(std::memory_order_seq_cst);
         assert(f.test_and_set() == 0);
Index: test/std/atomics/atomics.flag/init.pass.cpp
===================================================================
--- test/std/atomics/atomics.flag/init.pass.cpp
+++ test/std/atomics/atomics.flag/init.pass.cpp
@@ -9,6 +9,10 @@
 //
 // UNSUPPORTED: libcpp-has-no-threads
 
+// TODO: ATOMIC_FLAG_INIT is not defined before C++11 because it cannot be
+// implemented.
+// UNSUPPORTED: c++98, c++03
+
 // <atomic>
 
 // struct atomic_flag
Index: test/std/atomics/atomics.types.generic/trivially_copyable.fail.cpp
===================================================================
--- test/std/atomics/atomics.types.generic/trivially_copyable.fail.cpp
+++ test/std/atomics/atomics.types.generic/trivially_copyable.fail.cpp
@@ -47,6 +47,10 @@
 //     T operator=(T) noexcept;
 // };
 
+// TODO: There is currently no way to check if a type if trivially copyable
+// using GCC.
+// XFAIL: gcc
+
 #include <atomic>
 #include <new>
 #include <cassert>
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong.pass.cpp
@@ -23,6 +23,7 @@
 #include <atomic>
 #include <type_traits>
 #include <cassert>
+#include "test_macros.h"
 
 template <class T>
 void
@@ -58,7 +59,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
 
     friend bool operator==(const A& x, const A& y)
         {return x.i == y.i;}
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit.pass.cpp
@@ -26,6 +26,7 @@
 #include <atomic>
 #include <type_traits>
 #include <cassert>
+#include "test_macros.h"
 
 template <class T>
 void
@@ -65,7 +66,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
 
     friend bool operator==(const A& x, const A& y)
         {return x.i == y.i;}
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak.pass.cpp
@@ -26,6 +26,8 @@
 
 #include <cmpxchg_loop.h>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -60,7 +62,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
 
     friend bool operator==(const A& x, const A& y)
         {return x.i == y.i;}
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit.pass.cpp
@@ -29,6 +29,8 @@
 
 #include <cmpxchg_loop.h>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -67,7 +69,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
 
     friend bool operator==(const A& x, const A& y)
         {return x.i == y.i;}
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange.pass.cpp
@@ -24,6 +24,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -43,7 +45,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
 
     friend bool operator==(const A& x, const A& y)
         {return x.i == y.i;}
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit.pass.cpp
@@ -24,6 +24,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -45,7 +47,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
 
     friend bool operator==(const A& x, const A& y)
         {return x.i == y.i;}
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add.pass.cpp
@@ -32,6 +32,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -78,7 +80,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
     A(const A& a) : i(a.i) {}
     A(const volatile A& a) : i(a.i) {}
 
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp
@@ -32,6 +32,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -82,7 +84,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
     A(const A& a) : i(a.i) {}
     A(const volatile A& a) : i(a.i) {}
 
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub.pass.cpp
@@ -32,6 +32,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -78,7 +80,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
     A(const A& a) : i(a.i) {}
     A(const volatile A& a) : i(a.i) {}
 
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit.pass.cpp
@@ -33,6 +33,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -83,7 +85,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
     A(const A& a) : i(a.i) {}
     A(const volatile A& a) : i(a.i) {}
 
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_init.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_init.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_init.pass.cpp
@@ -24,6 +24,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -41,7 +43,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
 
     friend bool operator==(const A& x, const A& y)
         {return x.i == y.i;}
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load.pass.cpp
@@ -24,6 +24,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -41,7 +43,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
 
     friend bool operator==(const A& x, const A& y)
         {return x.i == y.i;}
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit.pass.cpp
@@ -24,6 +24,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -41,7 +43,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
 
     friend bool operator==(const A& x, const A& y)
         {return x.i == y.i;}
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store.pass.cpp
@@ -24,6 +24,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -41,7 +43,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
 
     friend bool operator==(const A& x, const A& y)
         {return x.i == y.i;}
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit.pass.cpp
@@ -24,6 +24,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test()
@@ -41,7 +43,7 @@
 {
     int i;
 
-    explicit A(int d = 0) noexcept {i=d;}
+    explicit A(int d = 0) TEST_NOEXCEPT {i=d;}
 
     friend bool operator==(const A& x, const A& y)
         {return x.i == y.i;}
Index: test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init.pass.cpp
===================================================================
--- test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init.pass.cpp
+++ test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init.pass.cpp
@@ -9,6 +9,10 @@
 //
 // UNSUPPORTED: libcpp-has-no-threads
 
+// TODO: ATOMIC_VAR_INIT is not defined before C++11 because it cannot be
+// implemented.
+// UNSUPPORTED: c++98, c++03
+
 // <atomic>
 
 // #define ATOMIC_VAR_INIT(value)
Index: test/std/atomics/libcpp-has-no-threads.fail.cpp
===================================================================
--- test/std/atomics/libcpp-has-no-threads.fail.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-// <atomic>
-
-// Test that including <atomic> fails to compile when _LIBCPP_HAS_NO_THREADS
-// is defined.
-
-#ifndef _LIBCPP_HAS_NO_THREADS
-#define _LIBCPP_HAS_NO_THREADS
-#endif
-
-#include <atomic>
-
-int main()
-{
-}
Index: test/std/atomics/libcpp-has-no-threads.pass.cpp
===================================================================
--- test/std/atomics/libcpp-has-no-threads.pass.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-// XFAIL: libcpp-has-no-threads
-
-#ifdef _LIBCPP_HAS_NO_THREADS
-#error This should be XFAIL'd for the purpose of detecting that the LIT feature\
- 'libcpp-has-no-threads' is available iff _LIBCPP_HAS_NO_THREADS is defined
-#endif
-
-int main()
-{
-}
Index: test/std/atomics/version.pass.cpp
===================================================================
--- test/std/atomics/version.pass.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// UNSUPPORTED: libcpp-has-no-threads
-
-// <atomic>
-
-#include <atomic>
-
-#ifndef _LIBCPP_VERSION
-#error _LIBCPP_VERSION not defined
-#endif
-
-int main()
-{
-}
Index: test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong.pass.cpp
===================================================================
--- test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong.pass.cpp
+++ test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong.pass.cpp
@@ -28,7 +28,6 @@
 
 int main()
 {
-#if __has_feature(cxx_atomic)
     {
         std::shared_ptr<int> p(new int(4));
         std::shared_ptr<int> v(new int(3));
@@ -49,5 +48,4 @@
         assert(*v == 4);
         assert(*w == 2);
     }
-#endif
 }
Index: test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong_explicit.pass.cpp
===================================================================
--- test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong_explicit.pass.cpp
+++ test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong_explicit.pass.cpp
@@ -29,7 +29,6 @@
 
 int main()
 {
-#if __has_feature(cxx_atomic)
     {
         std::shared_ptr<int> p(new int(4));
         std::shared_ptr<int> v(new int(3));
@@ -54,5 +53,4 @@
         assert(*v == 4);
         assert(*w == 2);
     }
-#endif
 }
Index: test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak.pass.cpp
===================================================================
--- test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak.pass.cpp
+++ test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak.pass.cpp
@@ -28,7 +28,6 @@
 
 int main()
 {
-#if __has_feature(cxx_atomic)
     {
         std::shared_ptr<int> p(new int(4));
         std::shared_ptr<int> v(new int(3));
@@ -49,5 +48,4 @@
         assert(*v == 4);
         assert(*w == 2);
     }
-#endif
 }
Index: test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak_explicit.pass.cpp
===================================================================
--- test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak_explicit.pass.cpp
+++ test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak_explicit.pass.cpp
@@ -29,7 +29,6 @@
 
 int main()
 {
-#if __has_feature(cxx_atomic)
     {
         std::shared_ptr<int> p(new int(4));
         std::shared_ptr<int> v(new int(3));
@@ -54,5 +53,4 @@
         assert(*v == 4);
         assert(*w == 2);
     }
-#endif
 }
Index: test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange.pass.cpp
===================================================================
--- test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange.pass.cpp
+++ test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange.pass.cpp
@@ -27,7 +27,6 @@
 
 int main()
 {
-#if __has_feature(cxx_atomic)
     {
         std::shared_ptr<int> p(new int(4));
         std::shared_ptr<int> r(new int(3));
@@ -35,5 +34,4 @@
         assert(*p == 3);
         assert(*r == 4);
     }
-#endif
 }
Index: test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange_explicit.pass.cpp
===================================================================
--- test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange_explicit.pass.cpp
+++ test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange_explicit.pass.cpp
@@ -27,7 +27,6 @@
 
 int main()
 {
-#if __has_feature(cxx_atomic)
     {
         std::shared_ptr<int> p(new int(4));
         std::shared_ptr<int> r(new int(3));
@@ -35,5 +34,4 @@
         assert(*p == 3);
         assert(*r == 4);
     }
-#endif
 }
Index: test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_is_lock_free.pass.cpp
===================================================================
--- test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_is_lock_free.pass.cpp
+++ test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_is_lock_free.pass.cpp
@@ -22,10 +22,8 @@
 
 int main()
 {
-#if __has_feature(cxx_atomic)
     {
         const std::shared_ptr<int> p(new int(3));
         assert(std::atomic_is_lock_free(&p) == false);
     }
-#endif
 }
Index: test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load.pass.cpp
===================================================================
--- test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load.pass.cpp
+++ test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load.pass.cpp
@@ -27,11 +27,9 @@
 
 int main()
 {
-#if __has_feature(cxx_atomic)
     {
         std::shared_ptr<int> p(new int(3));
         std::shared_ptr<int> q = std::atomic_load(&p);
         assert(*q == *p);
     }
-#endif
 }
Index: test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load_explicit.pass.cpp
===================================================================
--- test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load_explicit.pass.cpp
+++ test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load_explicit.pass.cpp
@@ -27,11 +27,9 @@
 
 int main()
 {
-#if __has_feature(cxx_atomic)
     {
         const std::shared_ptr<int> p(new int(3));
         std::shared_ptr<int> q = std::atomic_load_explicit(&p, std::memory_order_relaxed);
         assert(*q == *p);
     }
-#endif
 }
Index: test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store.pass.cpp
===================================================================
--- test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store.pass.cpp
+++ test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store.pass.cpp
@@ -27,12 +27,10 @@
 
 int main()
 {
-#if __has_feature(cxx_atomic)
     {
         std::shared_ptr<int> p;
         std::shared_ptr<int> r(new int(3));
         std::atomic_store(&p, r);
         assert(*p == *r);
     }
-#endif
 }
Index: test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store_explicit.pass.cpp
===================================================================
--- test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store_explicit.pass.cpp
+++ test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store_explicit.pass.cpp
@@ -27,12 +27,10 @@
 
 int main()
 {
-#if __has_feature(cxx_atomic)
     {
         std::shared_ptr<int> p;
         std::shared_ptr<int> r(new int(3));
         std::atomic_store_explicit(&p, r, std::memory_order_seq_cst);
         assert(*p == *r);
     }
-#endif
 }
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to