summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorRichard Smith <richard@metafoo.co.uk>2020-01-10 15:16:15 -0800
committerRichard Smith <richard@metafoo.co.uk>2020-01-10 15:18:36 -0800
commit7a38468e34eeeb59e80b176b97213d205d8d9b41 (patch)
treefb8054b8dbe96661bca0d22c0b9df58e540e7295 /clang
parentd3ba1e026dbc44e9097ce6ea1c92d065f1fe33e8 (diff)
downloadbcm5719-llvm-7a38468e34eeeb59e80b176b97213d205d8d9b41.tar.gz
bcm5719-llvm-7a38468e34eeeb59e80b176b97213d205d8d9b41.zip
Only destroy static locals if they have non-trivial destructors.
This fixes a regression introduced in 2b4fa5348ee157b6b1a1af44d0137ca8c7a71573 that caused us to emit shutdown-time destruction for variables with ARC ownership, using C++-specific functions that don't exist in C implementations.
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CGDecl.cpp3
-rw-r--r--clang/test/CodeGenObjC/initialize-function-static.m12
2 files changed, 14 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp
index 61fb8fa384c..86e02d2d7e4 100644
--- a/clang/lib/CodeGen/CGDecl.cpp
+++ b/clang/lib/CodeGen/CGDecl.cpp
@@ -366,7 +366,8 @@ CodeGenFunction::AddInitializerToStaticVarDecl(const VarDecl &D,
emitter.finalize(GV);
- if (D.needsDestruction(getContext()) && HaveInsertPoint()) {
+ if (D.needsDestruction(getContext()) == QualType::DK_cxx_destructor &&
+ HaveInsertPoint()) {
// We have a constant initializer, but a nontrivial destructor. We still
// need to perform a guarded "initialization" in order to register the
// destructor.
diff --git a/clang/test/CodeGenObjC/initialize-function-static.m b/clang/test/CodeGenObjC/initialize-function-static.m
new file mode 100644
index 00000000000..21ad320f782
--- /dev/null
+++ b/clang/test/CodeGenObjC/initialize-function-static.m
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -triple x86_64-apple-macos10.15 -emit-llvm -fobjc-arc -o - %s | FileCheck %s
+
+@interface I
+@end
+
+I *i() {
+ static I *i = ((void *)0);
+ return i;
+}
+
+// CHECK-NOT: __cxa_guard_acquire
+// CHECK-NOT: __cxa_guard_release
OpenPOWER on IntegriCloud