summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGCXXABI.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/CGCXXABI.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/CGCXXABI.cpp')
-rw-r--r--clang/lib/CodeGen/CGCXXABI.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGCXXABI.cpp b/clang/lib/CodeGen/CGCXXABI.cpp
index 55ddd666c49..bdd887c4a02 100644
--- a/clang/lib/CodeGen/CGCXXABI.cpp
+++ b/clang/lib/CodeGen/CGCXXABI.cpp
@@ -325,3 +325,12 @@ LValue CGCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
bool CGCXXABI::NeedsVTTParameter(GlobalDecl GD) {
return false;
}
+
+llvm::Value *CGCXXABI::EmitNewArrayLengthOverflowCheck(
+ CodeGenFunction &CGF, bool ConstantOverflow, llvm::Value *DynamicOverflow,
+ llvm::Value *Size) {
+ llvm::Value *AllOnes = llvm::Constant::getAllOnesValue(CGF.SizeTy);
+ if (ConstantOverflow)
+ return AllOnes;
+ return CGF.Builder.CreateSelect(DynamicOverflow, AllOnes, Size);
+}
OpenPOWER on IntegriCloud