On 18/12/2021 21:07, John Crow wrote:
Fwiw I'm seeing a failure, snippet below, when running `make check` on
valgrind-3.18.1. The package configures, makes, installs, and, as far
as I can tell, executes successfully.
$ uname -a
Linux foo-Inspiron-3583 5.4.0-91-generic #102-Ubuntu SMP Fri Nov 5
16:31:28 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ gcc --version
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
$ ./configure --prefix=/my/prefix # seems to work fine
$ make # completes successfully
$ make check
. . . snip ...
c++ -DHAVE_CONFIG_H -I. -I../.. -I../.. -I../../include
-I../../coregrind -I../../include -I../../VEX/pub -I../../VEX/pub
-DVGA_amd64=1 -DVGO_linux=1 -DVGP_amd64_linux=1
-DVGPV_amd64_linux_vanilla=1 -std=c++17 -Wno-mismatched-new-delete
-MT cxx17_aligned_new-cxx17_aligned_new.o -MD -MP -MF
.deps/cxx17_aligned_new-cxx17_aligned_new.Tpo -c -o
cxx17_aligned_new-cxx17_aligned_new.o `test -f 'cxx17_aligned_new.cpp'
|| echo './'`cxx17_aligned_new.cpp
cxx17_aligned_new.cpp:25:5: error: no matching function for call to
'operator delete'
operator delete(myClass, 64U, std::align_val_t(64U));
^~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/new:154:6:
note: candidate function not viable: no known conversion from
'unsigned int' to 'std::align_val_t' for 2nd argument
void operator delete(void*, std::align_val_t, const std::nothrow_t&)
Hi
That's for me.
You are building with the same compiler that was used at configure time?
configure.ac does contain a test for "operator delete(nullptr,
std::align_val_t(64U));" which I presume passes. It seems strange that
this passes (a C++17 feature) but the sized overload doesn't (which is a
combination of C++14 and C++17).
I'm using GCC 11 and in /usr/include/c++/11/new there is
/** These are replaceable signatures:
* - normal single new and delete (no arguments, throw @c bad_alloc on
error)
* - normal array new and delete (same)
* - @c nothrow single new and delete (take a @c nothrow argument, return
* @c NULL on error)
* - @c nothrow array new and delete (same)
*
* Placement new and delete signatures (take a memory address argument,
* does nothing) may not be replaced by a user's program.
*/
_GLIBCXX_NODISCARD void* operator new(std::size_t) _GLIBCXX_THROW
(std::bad_alloc)
__attribute__((__externally_visible__));
SNIP
#if __cpp_aligned_new
_GLIBCXX_NODISCARD void* operator new(std::size_t, std::align_val_t)
__attribute__((__externally_visible__, __alloc_size__ (1), __malloc__));
SNIP
#if __cpp_sized_deallocation
this is the one we want
void operator delete(void*, std::size_t, std::align_val_t)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
void operator delete[](void*, std::size_t, std::align_val_t)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
#endif // __cpp_sized_deallocation
#endif // __cpp_aligned_new
Does yours look similar?
Does the following change help
diff --git a/memcheck/tests/cxx17_aligned_new.cpp
b/memcheck/tests/cxx17_aligned_new.cpp
index 6f574d066..0eeec2ba6 100644
--- a/memcheck/tests/cxx17_aligned_new.cpp
+++ b/memcheck/tests/cxx17_aligned_new.cpp
@@ -22,10 +22,10 @@ int main() {
// sized versions
myClass = new MyClass();
- operator delete(myClass, 64U, std::align_val_t(64U));
+ operator delete(myClass, size_t(64U), std::align_val_t(64U));
myClass5 = new MyClass[5];
- operator delete [](myClass5, 320U, std::align_val_t(64U));
+ operator delete [](myClass5, size_t(320U), std::align_val_t(64U));
MyClass* myClassNt = new (std::nothrow) MyClass;
operator delete(myClassNt, std::align_val_t(64U), std::nothrow);
(a size_t literal suffix may come one day, but not for a few years at
least http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0330r8.html)
A+
Paul
_______________________________________________
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users