Workaround apparent g++12 spurious error
In file included from ../testshared.cpp:12:
In constructor ‘pvxs::shared_array<E, Enable>::shared_array(size_t, V) [with V = std::nullptr_t; E = std::unique_ptr<unsigned int>; Enable = void]’,
inlined from ‘void {anonymous}::testComplex()’ at ../testshared.cpp:225:57:
../../src/pvxs/sharedArray.h:288:17: error: pointer used after ‘void operator delete [](void*, std::size_t)’ [-Werror=use-after-free]
288 | :base_t(new _E_non_const[c], c)
| ^~~~~~~~~~~~~~~~~~~
In member function ‘void pvxs::detail::sa_default_delete<E>::operator()(E*) const [with E = std::unique_ptr<unsigned int>]’,
inlined from ‘std::__shared_count<_Lp>::__shared_count(_Ptr, _Deleter, _Alloc) [with _Ptr = std::unique_ptr<unsigned int>*; _Deleter = pvxs::detail::sa_default_delete<std::unique_ptr<unsigned int> >; _Alloc = std::allocator<void>; <template-parameter-2-4> = void; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]’ at /usr/include/c++/12/bits/shared_ptr_base.h:958:11,
inlined from ‘std::__shared_count<_Lp>::__shared_count(_Ptr, _Deleter) [with _Ptr = std::unique_ptr<unsigned int>*; _Deleter = pvxs::detail::sa_default_delete<std::unique_ptr<unsigned int> >; <template-parameter-2-3> = void; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]’ at /usr/include/c++/12/bits/shared_ptr_base.h:939:57,
inlined from ‘std::__shared_ptr<_Tp, _Lp>::__shared_ptr(_Yp*, _Deleter) [with _Yp = std::unique_ptr<unsigned int>; _Deleter = pvxs::detail::sa_default_delete<std::unique_ptr<unsigned int> >; <template-parameter-2-3> = void; _Tp = std::unique_ptr<unsigned int>; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]’ at /usr/include/c++/12/bits/shared_ptr_base.h:1478:17,
inlined from ‘std::shared_ptr<_Tp>::shared_ptr(_Yp*, _Deleter) [with _Yp = std::unique_ptr<unsigned int>; _Deleter = pvxs::detail::sa_default_delete<std::unique_ptr<unsigned int> >; <template-parameter-2-3> = void; _Tp = std::unique_ptr<unsigned int>]’ at /usr/include/c++/12/bits/shared_ptr.h:232:48,
inlined from ‘pvxs::detail::sa_base<E>::sa_base(A*, size_t) [with A = std::unique_ptr<unsigned int>; E = std::unique_ptr<unsigned int>]’ at ../../src/pvxs/sharedArray.h:136:10,
inlined from ‘pvxs::shared_array<E, Enable>::shared_array(size_t, V) [with V = std::nullptr_t; E = std::unique_ptr<unsigned int>; Enable = void]’ at ../../src/pvxs/sharedArray.h:288:39,
inlined from ‘void {anonymous}::testComplex()’ at ../testshared.cpp:225:57:
../../src/pvxs/sharedArray.h:92:35: note: call to ‘void operator delete [](void*, std::size_t)’ here
92 | void operator()(E* e) const { delete[] e; }
| ^~~~~~~~~~
This commit is contained in:
+16
-3
@@ -218,14 +218,27 @@ void testFreezeThawVoid()
|
||||
testEq(C[0], 5u);
|
||||
}
|
||||
|
||||
struct ImMobile {
|
||||
int v = 0;
|
||||
ImMobile() = default;
|
||||
|
||||
void store(int x) { v=x; }
|
||||
int load() const { return v; }
|
||||
|
||||
ImMobile(const ImMobile&) = delete;
|
||||
ImMobile(ImMobile&&) = delete;
|
||||
ImMobile& operator=(const ImMobile&) = delete;
|
||||
ImMobile& operator=(ImMobile&&) = delete;
|
||||
};
|
||||
|
||||
void testComplex()
|
||||
{
|
||||
testDiag("%s", __func__);
|
||||
|
||||
shared_array<std::unique_ptr<uint32_t>> X(2, nullptr);
|
||||
shared_array<ImMobile> X(2);
|
||||
|
||||
X[0] = decltype (X)::value_type{new uint32_t(4u)};
|
||||
testEq(*X[0], 4u);
|
||||
X[0].store(4);
|
||||
testEq(X[0].load(), 4);
|
||||
}
|
||||
|
||||
void testValue()
|
||||
|
||||
Reference in New Issue
Block a user