[all-commits] [llvm/llvm-project] 85a952: [libcxx] Remove empty ~__no_destroy (#89882)
Vitaly Buka via All-commits
all-commits at lists.llvm.org
Fri Apr 26 22:27:39 PDT 2024
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 85a9528aa1f2d54379bf972908e12ee2a6f07b4b
https://github.com/llvm/llvm-project/commit/85a9528aa1f2d54379bf972908e12ee2a6f07b4b
Author: Vitaly Buka <vitalybuka at google.com>
Date: 2024-04-26 (Fri, 26 Apr 2024)
Changed paths:
M libcxx/include/__utility/no_destroy.h
M libcxx/test/libcxx/transitive_includes/cxx20.csv
A libcxx/test/libcxx/utilities/no_destroy.pass.cpp
Log Message:
-----------
[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
To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications
More information about the All-commits
mailing list