forked from OSchip/llvm-project
Implement throw d, where d is a class type that requires copy
construction. WIP. llvm-svn: 89442
This commit is contained in:
parent
3153da7154
commit
d8d26d06a5
|
@ -88,9 +88,29 @@ void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E) {
|
||||||
const llvm::Type *Ty = ConvertType(ThrowType)->getPointerTo(0);
|
const llvm::Type *Ty = ConvertType(ThrowType)->getPointerTo(0);
|
||||||
const CXXRecordDecl *RD;
|
const CXXRecordDecl *RD;
|
||||||
RD = cast<CXXRecordDecl>(ThrowType->getAs<RecordType>()->getDecl());
|
RD = cast<CXXRecordDecl>(ThrowType->getAs<RecordType>()->getDecl());
|
||||||
|
llvm::Value *This = Builder.CreateBitCast(ExceptionPtr, Ty);
|
||||||
if (RD->hasTrivialCopyConstructor()) {
|
if (RD->hasTrivialCopyConstructor()) {
|
||||||
EmitAggExpr(E->getSubExpr(), Builder.CreateBitCast(ExceptionPtr, Ty),
|
EmitAggExpr(E->getSubExpr(), This, false);
|
||||||
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
|
} else
|
||||||
ErrorUnsupported(E, "throw expression with copy ctor");
|
ErrorUnsupported(E, "throw expression with copy ctor");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue