aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGObjCMac.cpp
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2009-03-03 19:52:17 +0000
committerSteve Naroff <snaroff@apple.com>2009-03-03 19:52:17 +0000
commit7ba138abd329e591a8f6d5001f60dd7082f71b3b (patch)
tree212e368f088faaf91df92cbd47c5e37f93b0dc42 /lib/CodeGen/CGObjCMac.cpp
parent14453bf723c025034823e4d4005a98ee176753a0 (diff)
Fix <rdar://problem/6640991> Exception handling executes wrong clause (Daniel, please verify).
Also necessary to fix: <rdar://problem/6632061> [sema] non object types should not be allowed in @catch statements <rdar://problem/6252237> [sema] qualified id should be disallowed in @catch statements git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65964 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGObjCMac.cpp')
-rw-r--r--lib/CodeGen/CGObjCMac.cpp36
1 files changed, 17 insertions, 19 deletions
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index 0f38eb94bc..bbbed3fe2b 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -2014,30 +2014,28 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
for (; CatchStmt; CatchStmt = CatchStmt->getNextCatchStmt()) {
llvm::BasicBlock *NextCatchBlock = CGF.createBasicBlock("catch");
- const DeclStmt *CatchParam = CatchStmt->getCatchParamStmt();
- const VarDecl *VD = 0;
+ const ParmVarDecl *CatchParam = CatchStmt->getCatchParamDecl();
const PointerType *PT = 0;
// catch(...) always matches.
if (!CatchParam) {
AllMatched = true;
} else {
- VD = cast<VarDecl>(CatchParam->getSolitaryDecl());
- PT = VD->getType()->getAsPointerType();
+ PT = CatchParam->getType()->getAsPointerType();
// catch(id e) always matches.
// FIXME: For the time being we also match id<X>; this should
// be rejected by Sema instead.
if ((PT && CGF.getContext().isObjCIdStructType(PT->getPointeeType())) ||
- VD->getType()->isObjCQualifiedIdType())
+ CatchParam->getType()->isObjCQualifiedIdType())
AllMatched = true;
}
if (AllMatched) {
if (CatchParam) {
- CGF.EmitStmt(CatchParam);
+ CGF.EmitLocalBlockVarDecl(*CatchParam);
assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?");
- CGF.Builder.CreateStore(Caught, CGF.GetAddrOfLocalVar(VD));
+ CGF.Builder.CreateStore(Caught, CGF.GetAddrOfLocalVar(CatchParam));
}
CGF.EmitStmt(CatchStmt->getCatchBody());
@@ -2063,13 +2061,13 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
// Emit the @catch block.
CGF.EmitBlock(MatchedBlock);
- CGF.EmitStmt(CatchParam);
+ CGF.EmitLocalBlockVarDecl(*CatchParam);
assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?");
llvm::Value *Tmp =
- CGF.Builder.CreateBitCast(Caught, CGF.ConvertType(VD->getType()),
+ CGF.Builder.CreateBitCast(Caught, CGF.ConvertType(CatchParam->getType()),
"tmp");
- CGF.Builder.CreateStore(Tmp, CGF.GetAddrOfLocalVar(VD));
+ CGF.Builder.CreateStore(Tmp, CGF.GetAddrOfLocalVar(CatchParam));
CGF.EmitStmt(CatchStmt->getCatchBody());
CGF.EmitBranchThroughCleanup(FinallyEnd);
@@ -4778,17 +4776,17 @@ CGObjCNonFragileABIMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
SelectorArgs.push_back(ObjCTypes.EHPersonalityPtr);
// Construct the lists of (type, catch body) to handle.
- llvm::SmallVector<std::pair<const DeclStmt*, const Stmt*>, 8> Handlers;
+ llvm::SmallVector<std::pair<const Decl*, const Stmt*>, 8> Handlers;
bool HasCatchAll = false;
if (isTry) {
if (const ObjCAtCatchStmt* CatchStmt =
cast<ObjCAtTryStmt>(S).getCatchStmts()) {
for (; CatchStmt; CatchStmt = CatchStmt->getNextCatchStmt()) {
- const DeclStmt *DS = CatchStmt->getCatchParamStmt();
- Handlers.push_back(std::make_pair(DS, CatchStmt->getCatchBody()));
+ const Decl *CatchDecl = CatchStmt->getCatchParamDecl();
+ Handlers.push_back(std::make_pair(CatchDecl, CatchStmt->getCatchBody()));
// catch(...) always matches.
- if (!DS) {
+ if (!CatchDecl) {
// Use i8* null here to signal this is a catch all, not a cleanup.
llvm::Value *Null = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
SelectorArgs.push_back(Null);
@@ -4796,7 +4794,7 @@ CGObjCNonFragileABIMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
break;
}
- const VarDecl *VD = cast<VarDecl>(DS->getSolitaryDecl());
+ const VarDecl *VD = cast<VarDecl>(CatchDecl);
if (CGF.getContext().isObjCIdType(VD->getType()) ||
VD->getType()->isObjCQualifiedIdType()) {
llvm::Value *IDEHType =
@@ -4826,7 +4824,7 @@ CGObjCNonFragileABIMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
// We use a cleanup unless there was already a catch all.
if (!HasCatchAll) {
SelectorArgs.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, 0));
- Handlers.push_back(std::make_pair((const DeclStmt*) 0, (const Stmt*) 0));
+ Handlers.push_back(std::make_pair((const Decl*) 0, (const Stmt*) 0));
}
llvm::Value *Selector =
@@ -4834,7 +4832,7 @@ CGObjCNonFragileABIMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
SelectorArgs.begin(), SelectorArgs.end(),
"selector");
for (unsigned i = 0, e = Handlers.size(); i != e; ++i) {
- const DeclStmt *CatchParam = Handlers[i].first;
+ const Decl *CatchParam = Handlers[i].first;
const Stmt *CatchBody = Handlers[i].second;
llvm::BasicBlock *Next = 0;
@@ -4871,10 +4869,10 @@ CGObjCNonFragileABIMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
// Bind the catch parameter if it exists.
if (CatchParam) {
- const VarDecl *VD = cast<VarDecl>(CatchParam->getSolitaryDecl());
+ const VarDecl *VD = dyn_cast<VarDecl>(CatchParam);
ExcObject = CGF.Builder.CreateBitCast(ExcObject,
CGF.ConvertType(VD->getType()));
- CGF.EmitStmt(CatchParam);
+ CGF.EmitLocalBlockVarDecl(*VD);
CGF.Builder.CreateStore(ExcObject, CGF.GetAddrOfLocalVar(VD));
}