From: Mike Stump Date: Fri, 20 Nov 2009 02:31:07 +0000 (+0000) Subject: Implement throw d, where d is a class type that requires copy X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d1abf673bf133bd779a94978286c92cef86d7d36;p=clang Implement throw d, where d is a class type that requires copy construction. WIP. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89442 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp index fafdf87aab..e1ba0459ac 100644 --- a/lib/CodeGen/CGException.cpp +++ b/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(ThrowType->getAs()->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()->getResultType(); + EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs), + Callee, CallArgs, CopyCtor); + // FIXME: region management } else ErrorUnsupported(E, "throw expression with copy ctor"); }