Summary:
Three fixes:
(1) The compiler reports UB in line 432 for the case M > HAZPTR_TC_SIZE even though it is executed only if M <= HAZPTR_TC_SIZE. Added a condition M <= HAZPTR_TC_SIZE to help the compiler determine that line 432 is not executed in that case.
(2) Added missing management of empty state in hazptr_array move operator
(3) Added nullptr argument to empty hazptr_array in Array test
Reviewed By: djwatson
Differential Revision:
D5951283
fbshipit-source-id:
cb8e61421ab06c7733f67bf2d2274d3311260ac4
if (LIKELY(ptc != nullptr)) {
auto& tc = *ptc;
auto count = tc.count();
- if (count + M <= HAZPTR_TC_SIZE) {
+ if ((M <= HAZPTR_TC_SIZE) && (count + M <= HAZPTR_TC_SIZE)) {
for (size_t i = 0; i < M; ++i) {
tc[count + i].hprec_ = h[i].hazptr_;
DEBUG_PRINT(i << " " << &h[i]);
h[i] = std::move(other[i]);
DEBUG_PRINT(i << " " << &h[i] << " " << &other[i]);
}
+ empty_ = other.empty_;
+ other.empty_ = true;
return *this;
}
// Protect object
hptr[9].reset(x);
// Empty array
- hazptr_array<10> h;
+ hazptr_array<10> h(nullptr);
// Move assignment
h = std::move(hptr);
// Retire object