summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-03-22 07:05:39 +0000
committerJohn McCall <rjmccall@apple.com>2011-03-22 07:05:39 +0000
commit6a4fa52b379425302825d38bb90c6f6934e3f090 (patch)
tree30efb0552892c5adc6f141592ca1f3b215b200e1 /clang/lib/CodeGen/CodeGenModule.cpp
parent8f9a42971eccfbf74c2ff55f116761fe06025592 (diff)
downloadbcm5719-llvm-6a4fa52b379425302825d38bb90c6f6934e3f090.tar.gz
bcm5719-llvm-6a4fa52b379425302825d38bb90c6f6934e3f090.zip
The emission of an Objective-C++'s class .cxx_destruct method should be
conditioned on whether it has any destructible ivars, not on whether it has any non-trivial class-object initializers. llvm-svn: 128074
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp45
1 files changed, 28 insertions, 17 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index ea74abff540..a528d2ede7a 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1937,37 +1937,48 @@ void CodeGenModule::EmitObjCPropertyImplementations(const
}
}
+static bool needsDestructMethod(ObjCImplementationDecl *impl) {
+ ObjCInterfaceDecl *iface
+ = const_cast<ObjCInterfaceDecl*>(impl->getClassInterface());
+ for (ObjCIvarDecl *ivar = iface->all_declared_ivar_begin();
+ ivar; ivar = ivar->getNextIvar())
+ if (ivar->getType().isDestructedType())
+ return true;
+
+ return false;
+}
+
/// EmitObjCIvarInitializations - Emit information for ivar initialization
/// for an implementation.
void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
+ // We might need a .cxx_destruct even if we don't have any ivar initializers.
+ if (needsDestructMethod(D)) {
+ IdentifierInfo *II = &getContext().Idents.get(".cxx_destruct");
+ Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
+ ObjCMethodDecl *DTORMethod =
+ ObjCMethodDecl::Create(getContext(), D->getLocation(), D->getLocation(),
+ cxxSelector, getContext().VoidTy, 0, D, true,
+ false, true, false, ObjCMethodDecl::Required);
+ D->addInstanceMethod(DTORMethod);
+ CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false);
+ }
+
+ // If the implementation doesn't have any ivar initializers, we don't need
+ // a .cxx_construct.
if (D->getNumIvarInitializers() == 0)
return;
- DeclContext* DC = const_cast<DeclContext*>(dyn_cast<DeclContext>(D));
- assert(DC && "EmitObjCIvarInitializations - null DeclContext");
- IdentifierInfo *II = &getContext().Idents.get(".cxx_destruct");
- Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
- ObjCMethodDecl *DTORMethod = ObjCMethodDecl::Create(getContext(),
- D->getLocation(),
- D->getLocation(), cxxSelector,
- getContext().VoidTy, 0,
- DC, true, false, true, false,
- ObjCMethodDecl::Required);
- D->addInstanceMethod(DTORMethod);
- CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false);
- II = &getContext().Idents.get(".cxx_construct");
- cxxSelector = getContext().Selectors.getSelector(0, &II);
+ IdentifierInfo *II = &getContext().Idents.get(".cxx_construct");
+ Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
// The constructor returns 'self'.
ObjCMethodDecl *CTORMethod = ObjCMethodDecl::Create(getContext(),
D->getLocation(),
D->getLocation(), cxxSelector,
getContext().getObjCIdType(), 0,
- DC, true, false, true, false,
+ D, true, false, true, false,
ObjCMethodDecl::Required);
D->addInstanceMethod(CTORMethod);
CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true);
-
-
}
/// EmitNamespace - Emit all declarations in a namespace.
OpenPOWER on IntegriCloud