diff options
author | Aaron Ballman <aaron@aaronballman.com> | 2014-08-28 16:48:44 +0000 |
---|---|---|
committer | Aaron Ballman <aaron@aaronballman.com> | 2014-08-28 16:48:44 +0000 |
commit | 33375375a4c31cf31803c6f9555ca023864818fe (patch) | |
tree | f8e4e3072f6693adc5dce78cf2a499134ecb2bd8 /clang/lib/CodeGen/CGExprCXX.cpp | |
parent | 50cbfc513827b192b77f3c2ee5ea70fcda36433e (diff) | |
download | bcm5719-llvm-33375375a4c31cf31803c6f9555ca023864818fe.tar.gz bcm5719-llvm-33375375a4c31cf31803c6f9555ca023864818fe.zip |
Throw a std::bad_array_new_length exception when the expression (or constant-expression) passed to operator new[] results in overflow in conformance with [expr.new]p7. Fixes PR11644.
llvm-svn: 216675
Diffstat (limited to 'clang/lib/CodeGen/CGExprCXX.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExprCXX.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp index db876b11694..1d175b25816 100644 --- a/clang/lib/CodeGen/CGExprCXX.cpp +++ b/clang/lib/CodeGen/CGExprCXX.cpp @@ -572,11 +572,11 @@ static llvm::Value *EmitCXXNewAllocSize(CodeGenFunction &CGF, } // On overflow, produce a -1 so operator new will fail. - if (hasAnyOverflow) { - size = llvm::Constant::getAllOnesValue(CGF.SizeTy); - } else { + if (hasAnyOverflow) + size = CGF.CGM.getCXXABI().EmitNewArrayLengthOverflowCheck( + CGF, true, nullptr, llvm::Constant::getAllOnesValue(CGF.SizeTy)); + else size = llvm::ConstantInt::get(CGF.SizeTy, allocationSize); - } // Otherwise, we might need to use the overflow intrinsics. } else { @@ -714,9 +714,9 @@ static llvm::Value *EmitCXXNewAllocSize(CodeGenFunction &CGF, // overwrite 'size' with an all-ones value, which should cause // operator new to throw. if (hasOverflow) - size = CGF.Builder.CreateSelect(hasOverflow, - llvm::Constant::getAllOnesValue(CGF.SizeTy), - size); + size = CGF.CGM.getCXXABI().EmitNewArrayLengthOverflowCheck(CGF, false, + hasOverflow, + size); } if (cookieSize == 0) |