Check for null correctly for new expressions.

llvm-svn: 72678
This commit is contained in:
Anders Carlsson 2009-06-01 00:05:16 +00:00
parent cba81fc4de
commit ca50119a31
2 changed files with 37 additions and 4 deletions

View File

@ -292,13 +292,27 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
bool NullCheckResult = NewFTy->hasEmptyExceptionSpec() &&
!(AllocType->isPODType() && !E->hasInitializer());
llvm::BasicBlock *NewNull = 0;
llvm::BasicBlock *NewNotNull = 0;
llvm::BasicBlock *NewEnd = 0;
llvm::Value *NewPtr = RV.getScalarVal();
if (NullCheckResult) {
ErrorUnsupported(E, "new expr that needs to be null checked");
return llvm::UndefValue::get(ConvertType(E->getType()));
NewNull = createBasicBlock("new.null");
NewNotNull = createBasicBlock("new.notnull");
NewEnd = createBasicBlock("new.end");
llvm::Value *IsNull =
Builder.CreateICmpEQ(NewPtr,
llvm::Constant::getNullValue(NewPtr->getType()),
"isnull");
Builder.CreateCondBr(IsNull, NewNull, NewNotNull);
EmitBlock(NewNotNull);
}
llvm::Value *NewPtr =
Builder.CreateBitCast(RV.getScalarVal(), ConvertType(E->getType()));
NewPtr = Builder.CreateBitCast(NewPtr, ConvertType(E->getType()));
if (AllocType->isPODType()) {
if (E->hasInitializer()) {
@ -323,6 +337,20 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
E->constructor_arg_end());
}
if (NullCheckResult) {
Builder.CreateBr(NewEnd);
EmitBlock(NewNull);
Builder.CreateBr(NewEnd);
EmitBlock(NewEnd);
llvm::PHINode *PHI = Builder.CreatePHI(NewPtr->getType());
PHI->reserveOperandSpace(2);
PHI->addIncoming(NewPtr, NewNotNull);
PHI->addIncoming(llvm::Constant::getNullValue(NewPtr->getType()), NewNull);
NewPtr = PHI;
}
return NewPtr;
}

View File

@ -45,3 +45,8 @@ void t5() {
// RUN: grep "call void @_ZN2T2C1Eii" %t | count 1
T2 *t2 = new T2(10, 10);
}
int *t6() {
// Null check.
return new (0) int(10);
}