summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-11-20 02:31:07 +0000
committerMike Stump <mrs@apple.com>2009-11-20 02:31:07 +0000
commitd8d26d06a593581219be709f410e22ed85c9ade8 (patch)
tree2aed4bb2b8bc79b1b044c9224a4ec76bff677782 /clang/lib
parent3153da7154ad38dec9e0487567323620d9bdb3cc (diff)
downloadbcm5719-llvm-d8d26d06a593581219be709f410e22ed85c9ade8.tar.gz
bcm5719-llvm-d8d26d06a593581219be709f410e22ed85c9ade8.zip
Implement throw d, where d is a class type that requires copy
construction. WIP. llvm-svn: 89442
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CGException.cpp24
1 files changed, 22 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp
index fafdf87aabf..e1ba0459aca 100644
--- a/clang/lib/CodeGen/CGException.cpp
+++ b/clang/lib/CodeGen/CGException.cpp
@@ -88,9 +88,29 @@ void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E) {
const llvm::Type *Ty = ConvertType(ThrowType)->getPointerTo(0);
const CXXRecordDecl *RD;
RD = cast<CXXRecordDecl>(ThrowType->getAs<RecordType>()->getDecl());
+ llvm::Value *This = Builder.CreateBitCast(ExceptionPtr, Ty);
if (RD->hasTrivialCopyConstructor()) {
- EmitAggExpr(E->getSubExpr(), Builder.CreateBitCast(ExceptionPtr, Ty),
- false);
+ EmitAggExpr(E->getSubExpr(), This, false);
+ } else if (CXXConstructorDecl *CopyCtor
+ = RD->getCopyConstructor(getContext(), 0)) {
+ // FIXME: region management
+ llvm::Value *Src = EmitLValue(E->getSubExpr()).getAddress();
+
+ // Stolen from EmitClassAggrMemberwiseCopy
+ llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(CopyCtor,
+ Ctor_Complete);
+ CallArgList CallArgs;
+ CallArgs.push_back(std::make_pair(RValue::get(This),
+ CopyCtor->getThisType(getContext())));
+
+ // Push the Src ptr.
+ CallArgs.push_back(std::make_pair(RValue::get(Src),
+ CopyCtor->getParamDecl(0)->getType()));
+ QualType ResultType =
+ CopyCtor->getType()->getAs<FunctionType>()->getResultType();
+ EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs),
+ Callee, CallArgs, CopyCtor);
+ // FIXME: region management
} else
ErrorUnsupported(E, "throw expression with copy ctor");
}
OpenPOWER on IntegriCloud