aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/ADT/StringRefTest.cpp
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2024-04-26 22:27:16 -0700
committerGitHub <noreply@github.com>2024-04-26 22:27:16 -0700
commit85a9528aa1f2d54379bf972908e12ee2a6f07b4b (patch)
treea5b00916164a0aa02740910e22e9fee9ebb78264 /llvm/unittests/ADT/StringRefTest.cpp
parent90a959a8c978671467041c865509a0e1823c5115 (diff)
downloadllvm-85a9528aa1f2d54379bf972908e12ee2a6f07b4b.zip
llvm-85a9528aa1f2d54379bf972908e12ee2a6f07b4b.tar.gz
llvm-85a9528aa1f2d54379bf972908e12ee2a6f07b4b.tar.bz2
[libcxx] Remove empty ~__no_destroy (#89882)
Primary motivation: is that after #84651 msan will complain if fields accessed after ~__no_destroy. My understanding of the https://eel.is/c++draft/basic.life#10 Static object with trivial destruction has program lifetime. Static object with empty destuctor has implicit lifetime, and accessing the object after lifetime is UB. It was UB before #84651, it's just msan ignored union members. Existing code with unions uses empty destructor, so accessing after the main() can cause UB. "placement new" version can have trivial destructor, so there is no end of lifetime. Secondary motivation: empty destructor will register __cxa_atexit with -O0. https://gcc.godbolt.org/z/hce587b65 We can not remove the destructor with union where _Tp can have non-trivial destructor. But we can remove destructor if we use in-place new instead of union. https://gcc.godbolt.org/z/Yqxx57eEd - empty even with -O0. New test fails without the patch on https://lab.llvm.org/buildbot/#/builders/sanitizer-x86_64-linux-bootstrap-msan
Diffstat (limited to 'llvm/unittests/ADT/StringRefTest.cpp')
0 files changed, 0 insertions, 0 deletions