mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
libstdc++: Suppress -Wclass-memaccess warnings in bits/stl_uninitialized.h
Running the testsuite with warnings enabled gives: FAIL: 20_util/specialized_algorithms/uninitialized_copy/58982.cc -std=gnu++26 (test for excess errors) Excess errors: .../libstdc++-v3/include/bits/stl_uninitialized.h:293: warning: 'void* __builtin_memcpy(void*, const void*, long unsigned int)' writing to an object of type 'struct T' with no trivial copy-assignment; use copy-initialization instead [-Wclass-memaccess] This is because -Wclass-memaccess warns about using memcpy on types which have a deleted assignment, even though those can be trivially copyable and so using memcpy on them is technically valid. Where these warnings occur in bits/stl_uninitialized.h we're only using memcpy after checking for trivially copyable (and any other relevant conditions) so we can be confident that we're using it safely. We also don't actually care about assignment here because we're only constructing new objects, not copying over existing ones (which is what std::copy does, but not std::uninitialized_copy). Uses of memcpy in the C++98 code don't need to have -Wclass-memaccess suppressed, because there are no deleted functions in C++98 so there are no types which are trivially copyable but trigger the warning. libstdc++-v3/ChangeLog: * include/bits/stl_uninitialized.h (uninitialized_copy) (uninitialized_fill, uninitialized_fill_n): Use pragmas to suppress -Wclass-memaccess warnings. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
This commit is contained in:
committed by
Jonathan Wakely
parent
c6865e7e15
commit
f4409fd794
@@ -236,6 +236,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wc++17-extensions"
|
||||
#pragma GCC diagnostic ignored "-Wclass-memaccess"
|
||||
/**
|
||||
* @brief Copies the range [first,last) into result.
|
||||
* @param __first An input iterator.
|
||||
@@ -427,6 +428,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
#if __cplusplus >= 201103L
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wc++17-extensions"
|
||||
#pragma GCC diagnostic ignored "-Wclass-memaccess"
|
||||
#if __glibcxx_raw_memory_algorithms >= 202411L // >= C++26
|
||||
if consteval {
|
||||
return std::__do_uninit_fill(__first, __last, __x);
|
||||
@@ -529,6 +531,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wc++17-extensions"
|
||||
#pragma GCC diagnostic ignored "-Wclass-memaccess"
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// DR 1339. uninitialized_fill_n should return the end of its range
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user