From 7a38468e34eeeb59e80b176b97213d205d8d9b41 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Fri, 10 Jan 2020 15:16:15 -0800 Subject: [PATCH] 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. --- clang/lib/CodeGen/CGDecl.cpp | 3 ++- clang/test/CodeGenObjC/initialize-function-static.m | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeGenObjC/initialize-function-static.m diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index 61fb8fa..86e02d2 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 0000000..21ad320 --- /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 -- 2.7.4