aboutsummaryrefslogtreecommitdiff
path: root/clang
diff options
context:
space:
mode:
authorycdtosa <ycdtosa@users.noreply.github.com>2024-03-26 13:38:31 +0100
committerGitHub <noreply@github.com>2024-03-26 08:38:31 -0400
commit59e052568e7d46cc0489269e3c76f53bb21941f5 (patch)
tree222260d9b5473a42a09a7257d97eb2fce579fe15 /clang
parent19ca79e8671439338b429982c457304c70eca701 (diff)
downloadllvm-59e052568e7d46cc0489269e3c76f53bb21941f5.zip
llvm-59e052568e7d46cc0489269e3c76f53bb21941f5.tar.gz
llvm-59e052568e7d46cc0489269e3c76f53bb21941f5.tar.bz2
[[clang::always_destroy]] attribute silences warn-exit-time-destructor (#86486)
This attribute tells the compiler that the variable must have its exit-time destructor run, so it makes sense that it would silence the warning telling users that an exit-time destructor is required. Fixes https://github.com/llvm/llvm-project/issues/68686
Diffstat (limited to 'clang')
-rw-r--r--clang/docs/ReleaseNotes.rst4
-rw-r--r--clang/include/clang/Basic/AttrDocs.td3
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp3
-rw-r--r--clang/test/SemaCXX/warn-exit-time-destructors.cpp10
4 files changed, 19 insertions, 1 deletions
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7fbe2fe..af2295c 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -295,6 +295,10 @@ Improvements to Clang's diagnostics
- Clang now correctly diagnoses no arguments to a variadic macro parameter as a C23/C++20 extension.
Fixes #GH84495.
+- Clang no longer emits a ``-Wexit-time destructors`` warning on static variables explicitly
+ annotated with the ``clang::always_destroy`` attribute.
+ Fixes #GH68686, #GH86486
+
Improvements to Clang's time-trace
----------------------------------
diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td
index 9de14f6..384aebb 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -6069,6 +6069,9 @@ def AlwaysDestroyDocs : Documentation {
The ``always_destroy`` attribute specifies that a variable with static or thread
storage duration should have its exit-time destructor run. This attribute is the
default unless clang was invoked with -fno-c++-static-destructors.
+
+If a variable is explicitly declared with this attribute, Clang will silence
+otherwise applicable ``-Wexit-time-destructors`` warnings.
}];
}
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index ee732679..7070ea0 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -16202,7 +16202,8 @@ void Sema::FinalizeVarWithDestructor(VarDecl *VD, const RecordType *Record) {
// Emit warning for non-trivial dtor in global scope (a real global,
// class-static, function-static).
- Diag(VD->getLocation(), diag::warn_exit_time_destructor);
+ if (!VD->hasAttr<AlwaysDestroyAttr>())
+ Diag(VD->getLocation(), diag::warn_exit_time_destructor);
// TODO: this should be re-enabled for static locals by !CXAAtExit
if (!VD->isStaticLocal())
diff --git a/clang/test/SemaCXX/warn-exit-time-destructors.cpp b/clang/test/SemaCXX/warn-exit-time-destructors.cpp
index 2f14243..55ae37d 100644
--- a/clang/test/SemaCXX/warn-exit-time-destructors.cpp
+++ b/clang/test/SemaCXX/warn-exit-time-destructors.cpp
@@ -51,6 +51,15 @@ struct A { ~A(); };
}
namespace test5 {
+ struct A { ~A(); };
+ [[clang::always_destroy]] A a; // no warning
+
+ void func() {
+ [[clang::always_destroy]] static A a; // no warning
+ }
+}
+
+namespace test6 {
#if __cplusplus >= 202002L
#define CPP20_CONSTEXPR constexpr
#else
@@ -68,3 +77,4 @@ namespace test5 {
T t; // expected-warning {{exit-time destructor}}
#undef CPP20_CONSTEXPR
}
+