Stephan Tolksdorf: fixes the issue in the <atomic> header and adds corresponding tests. I've used macros to fall back to a user-provided default constructor if _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS (though I suspect that there won't be many users defining that macro).
The tests use placement new to check that atomic values get properly zero-initialized. I had to modify the atomic_is_lock_free test, because default initialization of an object of const type 'const A' (aka 'const atomic<int>') requires a user-provided default constructor. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@180945 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -14,9 +14,18 @@
|
||||
// atomic_flag() = default;
|
||||
|
||||
#include <atomic>
|
||||
#include <new>
|
||||
#include <cassert>
|
||||
|
||||
int main()
|
||||
{
|
||||
std::atomic_flag f;
|
||||
|
||||
{
|
||||
typedef std::atomic_flag A;
|
||||
_ALIGNAS_TYPE(A) char storage[sizeof(A)] = {1};
|
||||
A& zero = *new (storage) A();
|
||||
assert(!zero.test_and_set());
|
||||
zero.~A();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
// };
|
||||
|
||||
#include <atomic>
|
||||
#include <new>
|
||||
#include <type_traits>
|
||||
#include <cassert>
|
||||
|
||||
@@ -112,6 +113,13 @@ do_test()
|
||||
assert(obj == T(5*sizeof(X)));
|
||||
assert((obj -= std::ptrdiff_t(3)) == T(2*sizeof(X)));
|
||||
assert(obj == T(2*sizeof(X)));
|
||||
|
||||
{
|
||||
_ALIGNAS_TYPE(A) char storage[sizeof(A)] = {23};
|
||||
A& zero = *new (storage) A();
|
||||
assert(zero == 0);
|
||||
zero.~A();
|
||||
}
|
||||
}
|
||||
|
||||
template <class A, class T>
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
// typedef atomic<bool> atomic_bool;
|
||||
|
||||
#include <atomic>
|
||||
#include <new>
|
||||
#include <cassert>
|
||||
|
||||
int main()
|
||||
@@ -219,4 +220,11 @@ int main()
|
||||
assert((obj = true) == true);
|
||||
assert(obj == true);
|
||||
}
|
||||
{
|
||||
typedef std::atomic<bool> A;
|
||||
_ALIGNAS_TYPE(A) char storage[sizeof(A)] = {1};
|
||||
A& zero = *new (storage) A();
|
||||
assert(zero == false);
|
||||
zero.~A();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,6 +85,7 @@
|
||||
// };
|
||||
|
||||
#include <atomic>
|
||||
#include <new>
|
||||
#include <cassert>
|
||||
|
||||
template <class A, class T>
|
||||
@@ -143,6 +144,13 @@ do_test()
|
||||
assert(obj == T(7));
|
||||
assert((obj ^= T(0xF)) == T(8));
|
||||
assert(obj == T(8));
|
||||
|
||||
{
|
||||
_ALIGNAS_TYPE(A) char storage[sizeof(A)] = {23};
|
||||
A& zero = *new (storage) A();
|
||||
assert(zero == 0);
|
||||
zero.~A();
|
||||
}
|
||||
}
|
||||
|
||||
template <class A, class T>
|
||||
|
||||
@@ -24,10 +24,10 @@ void
|
||||
test()
|
||||
{
|
||||
typedef std::atomic<T> A;
|
||||
const A ct;
|
||||
bool b1 = std::atomic_is_lock_free(&ct);
|
||||
const volatile A cvt;
|
||||
bool b2 = std::atomic_is_lock_free(&cvt);
|
||||
A t;
|
||||
bool b1 = std::atomic_is_lock_free(static_cast<const A*>(&t));
|
||||
volatile A vt;
|
||||
bool b2 = std::atomic_is_lock_free(static_cast<const volatile A*>(&vt));
|
||||
}
|
||||
|
||||
struct A
|
||||
|
||||
Reference in New Issue
Block a user