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/CGCXXABI.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/CGCXXABI.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGCXXABI.cpp | 9 |
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); +} |

