[Bug c++/84656] New: -Wclass-memaccess spuriously warns in code paths that cannot access nontrivial types
evan at eklitzke dot org
gcc-bugzilla@gcc.gnu.org
Thu Mar 1 20:40:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84656
Bug ID: 84656
Summary: -Wclass-memaccess spuriously warns in code paths that
cannot access nontrivial types
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: evan at eklitzke dot org
Target Milestone: ---
$ gcc --version
gcc (GCC) 8.0.1 20180218 (Red Hat 8.0.1-0.14)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ cat bug.cc
#include <cstring>
#include <type_traits>
struct nontrivial_t {
int x;
nontrivial_t() :x(1) {}
};
static_assert(!std::is_trivial<nontrivial_t>::value);
template <typename T>
void magic(T *val) {
if (std::is_trivial<T>::value) {
::memset(val, 0, sizeof(T));
} else {
*val = T();
}
}
void bug() {
nontrivial_t b;
magic<nontrivial_t>(&b);
}
$ gcc -Wclass-memaccess -c bug.cc
bug.cc: In instantiation of ‘void magic(T*) [with T = nontrivial_t]’:
bug.cc:21:25: required from here
bug.cc:13:13: warning: ‘void* memset(void*, int, size_t)’ clearing an object of
non-trivial type ‘struct nontrivial_t’; use assignment or value-initialization
instead [-Wclass-memaccess]
::memset(val, 0, sizeof(T));
~~~~~~~~^~~~~~~~~~~~~~~~~~~
bug.cc:4:8: note: ‘struct nontrivial_t’ declared here
struct nontrivial_t {
^~~~~~~~~~~~
More information about the Gcc-bugs
mailing list