summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGExprCXX.cpp
diff options
context:
space:
mode:
authorAaron Ballman <aaron@aaronballman.com>2014-08-28 16:48:44 +0000
committerAaron Ballman <aaron@aaronballman.com>2014-08-28 16:48:44 +0000
commit33375375a4c31cf31803c6f9555ca023864818fe (patch)
treef8e4e3072f6693adc5dce78cf2a499134ecb2bd8 /clang/lib/CodeGen/CGExprCXX.cpp
parent50cbfc513827b192b77f3c2ee5ea70fcda36433e (diff)
downloadbcm5719-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.cpp14
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)
OpenPOWER on IntegriCloud