diff options
author | Mike Stump <mrs@apple.com> | 2009-11-20 02:31:07 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-11-20 02:31:07 +0000 |
commit | d8d26d06a593581219be709f410e22ed85c9ade8 (patch) | |
tree | 2aed4bb2b8bc79b1b044c9224a4ec76bff677782 /clang/lib | |
parent | 3153da7154ad38dec9e0487567323620d9bdb3cc (diff) | |
download | bcm5719-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.cpp | 24 |
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"); } |