Only destroy static locals if they have non-trivial destructors.
authorRichard Smith <richard@metafoo.co.uk>
Fri, 10 Jan 2020 23:16:15 +0000 (15:16 -0800)
committerRichard Smith <richard@metafoo.co.uk>
Fri, 10 Jan 2020 23:18:36 +0000 (15:18 -0800)
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.

clang/lib/CodeGen/CGDecl.cpp
clang/test/CodeGenObjC/initialize-function-static.m [new file with mode: 0644]

index 61fb8fa..86e02d2 100644 (file)
@@ -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 (file)
index 0000000..21ad320
--- /dev/null
@@ -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