summaryrefslogtreecommitdiff
path: root/include/basic
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2019-10-07 17:31:02 +0200
committerStephan Bergmann <sbergman@redhat.com>2019-10-08 11:30:17 +0200
commit8f4fdb405a8470b9d06ab14ced120da89b213e82 (patch)
tree74451732aec125ac12f92f1982f1ede100d10cc6 /include/basic
parentc18280e6b2b22936f00e1c88606eadc6dfd9e100 (diff)
New loplugin:classmemaccess
...to complement and improve upon GCC's -Wclass-memaccess. See the comment at the head of compilerplugins/clang/classmemaccess.cxx for details. (It is not yet clear to me whether we would want to get this upstreamed into Clang.) 35d21e4bf6f66b3bbc7a44fcf184cb721b524a94 "Remove redundant memsets" was a case that benefited from looking through toplevel casts to void*. (Though the code in include/basic/sbxvar.hxx needs a slightly more verbose way to deliberately silence the warning now.) d03041e19215592f21ba1222d3cfa29e1f94260a "Drop bogus memsets" is one example of various cases that GCC -Wclass-memaccess failed to catch due to the use of array instead of pointer types. Change-Id: I6a9bfc34e3536834af35fdf4fb7ceeb31f31f8c0 Reviewed-on: https://gerrit.libreoffice.org/80421 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'include/basic')
-rw-r--r--include/basic/sbxvar.hxx7
1 files changed, 4 insertions, 3 deletions
diff --git a/include/basic/sbxvar.hxx b/include/basic/sbxvar.hxx
index 446f1fe4c1ec..270db0d137af 100644
--- a/include/basic/sbxvar.hxx
+++ b/include/basic/sbxvar.hxx
@@ -81,9 +81,10 @@ struct SbxValues
void clear(SbxDataType type) {
// A hacky way of zeroing the union value corresponding to the given type (even though the
// relevant zero value need not be represented by all-zero bits, in general) without evoking
- // GCC 8 -Wclass-memaccess, and without having to turn the anonymous union into a non-
- // anonymous one:
- std::memset(static_cast<void *>(this), 0, offsetof(SbxValues, eType));
+ // GCC 8 -Wclass-memaccess or loplugin:classmemaccess, and without having to turn the
+ // anonymous union into a non-anonymous one:
+ auto const p = static_cast<void *>(this);
+ std::memset(p, 0, offsetof(SbxValues, eType));
eType = type;
}
};