[core] Use __builtin_memcpy in Callback::create for cleaner code

Replace char-by-char loops with __builtin_memcpy in the inline
Callback storage path. Generates identical code but is cleaner
and avoids clang-analyzer false positives without NOLINT annotations.
This commit is contained in:
J. Nick Koston
2026-03-15 22:38:11 -10:00
parent 3c90438947
commit 3cebea9538
+2 -7
View File
@@ -1752,15 +1752,10 @@ template<typename... Ts> struct Callback<void(Ts...)> {
// creates objects of implicit-lifetime types (trivially copyable qualifies).
Callback cb;
cb.ctx = nullptr;
char *dst = reinterpret_cast<char *>(&cb.ctx); // NOLINT(clang-analyzer-core.uninitialized.Assign)
const char *src = reinterpret_cast<const char *>(&callable); // NOLINT(clang-analyzer-core.uninitialized.Assign)
for (size_t i = 0; i < sizeof(DecayF); ++i)
dst[i] = src[i]; // NOLINT(clang-analyzer-core.uninitialized.Assign)
__builtin_memcpy(&cb.ctx, &callable, sizeof(DecayF));
cb.fn = [](void *c, Ts... args) {
alignas(DecayF) char buf[sizeof(DecayF)];
const char *csrc = reinterpret_cast<const char *>(&c); // NOLINT(clang-analyzer-core.uninitialized.Assign)
for (size_t i = 0; i < sizeof(DecayF); ++i)
buf[i] = csrc[i]; // NOLINT(clang-analyzer-core.uninitialized.Assign)
__builtin_memcpy(buf, &c, sizeof(DecayF));
reinterpret_cast<DecayF *>(buf)->operator()(args...);
};
return cb;