After putting this question up on cfe-dev I have decided that it would be best to allow the use of <atomic> in C++03. Although static initialization is a concern the syntax required to get it is C++11 only. Meaning that C++11 constant static initialization cannot silently break in C++03, it will always cause a syntax error. Furthermore ATOMIC_VAR_INIT and ATOMIC_FLAG_INIT remain defined in C++03 even though they cannot be used because C++03 usages will cause better error messages.
The main change in this patch is to replace __has_feature(cxx_atomic), which only returns true when C++ >= 11, to __has_extension(c_atomic) which returns true whenever clang supports the required atomic builtins.
This patch adds the following macros:
- _LIBCPP_HAS_C_ATOMIC_IMP - Defined on clang versions which provide the C _Atomic keyword.
- _LIBCPP_HAS_GCC_ATOMIC_IMP - Defined on GCC > 4.7. We must use the fallback atomic implementation.
- _LIBCPP_HAS_NO_ATOMIC_HEADER - Defined when it is not safe to include <atomic>.
_LIBCPP_HAS_C_ATOMIC_IMP and _LIBCPP_HAS_GCC_ATOMIC_IMP are mutually exclusive, only one should be defined. If neither is defined then <atomic> is not implemented and including <atomic> will issue an error.