From f11085398dc27c0010663c711d4a10113e41d70f Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Mon, 1 Jun 2009 00:05:16 +0000 Subject: [PATCH] Check for null correctly for new expressions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72678 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGCXX.cpp | 36 ++++++++++++++++++++++++++++++++---- test/CodeGenCXX/new.cpp | 5 +++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 2cc9d0390f..32152f96bf 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -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; } diff --git a/test/CodeGenCXX/new.cpp b/test/CodeGenCXX/new.cpp index e3d1ec1df6..70ad269d24 100644 --- a/test/CodeGenCXX/new.cpp +++ b/test/CodeGenCXX/new.cpp @@ -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); +} -- 2.40.0