https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81327
Bug ID: 81327 Summary: cast to void* does not suppress -Wclass-memaccess Product: gcc Version: 8.0 Status: UNCONFIRMED Severity: minor Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- In cases where the -Wclass-memaccess warning (new in GCC 8) points out benign code the warning can be suppressed by casting a pointer to the class object to char*. In Clang that implements a similar warning (-Wdynamic-class-memaccess), the warning can also be suppressed by casting the pointer to void* but the same doesn't work in GCC. It's been suggested that it might be nice if GCC also recognized a void* cast as a suppression mechanism. (Unfortunately, where the warning is implemented in the GCC C++ front end an explicit void* cast is indistinguishable from the implicit conversion to the void* argument to the raw memory function.) $ cat t.C && gcc -S -Wall t.C struct S { virtual ~S (); }; void f (struct S *s) { __builtin_memset (s, 0, sizeof *s); } void g (struct S *s) { __builtin_memset ((void*)s, 0, sizeof *s); } void h (struct S *s) { __builtin_memset ((char*)s, 0, sizeof *s); } t.C: In function ‘void f(S*)’: t.C:5:36: warning: ‘void* __builtin_memset(void*, int, long unsigned int)’ clearing an object of type ‘struct S’ with no trivial copy-assignment; use assignment or value-initialization instead [-Wclass-memaccess] __builtin_memset (s, 0, sizeof *s); ^ t.C:1:8: note: ‘struct S’ declared here struct S { virtual ~S (); }; ^ t.C: In function ‘void g(S*)’: t.C:10:43: warning: ‘void* __builtin_memset(void*, int, long unsigned int)’ clearing an object of type ‘struct S’ with no trivial copy-assignment; use assignment or value-initialization instead [-Wclass-memaccess] __builtin_memset ((void*)s, 0, sizeof *s); ^ t.C:1:8: note: ‘struct S’ declared here struct S { virtual ~S (); }; ^ Clang output for the same test case: $ clang -S -Wall t.C t.C:5:21: warning: destination for this '__builtin_memset' call is a pointer to dynamic class 'S'; vtable pointer will be overwritten [-Wdynamic-class-memaccess] __builtin_memset (s, 0, sizeof *s); ~~~~~~~~~~~~~~~~ ^ t.C:5:21: note: explicitly cast the pointer to silence this warning __builtin_memset (s, 0, sizeof *s); ^ (void*) 1 warning generated.