https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/114380
We have a special diagnostic ID for this. >From e172eea48fb60282ded94f7e4e61f4cf60a289ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Thu, 31 Oct 2024 10:29:48 +0100 Subject: [PATCH] [clang][bytecode] Diagnose negative array sizes differently We have a special diagnostic ID for this. --- clang/lib/AST/ByteCode/Interp.h | 10 ++++++++-- clang/test/AST/ByteCode/new-delete.cpp | 9 +++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h index c95b18ef72c966..2bf7f471e7c28b 100644 --- a/clang/lib/AST/ByteCode/Interp.h +++ b/clang/lib/AST/ByteCode/Interp.h @@ -273,8 +273,14 @@ bool CheckArraySize(InterpState &S, CodePtr OpPC, SizeT *NumElements, *NumElements > MaxElements) { if (!IsNoThrow) { const SourceInfo &Loc = S.Current->getSource(OpPC); - S.FFDiag(Loc, diag::note_constexpr_new_too_large) - << NumElements->toDiagnosticString(S.getASTContext()); + + if (NumElements->isSigned() && NumElements->isNegative()) { + S.FFDiag(Loc, diag::note_constexpr_new_negative) + << NumElements->toDiagnosticString(S.getASTContext()); + } else { + S.FFDiag(Loc, diag::note_constexpr_new_too_large) + << NumElements->toDiagnosticString(S.getASTContext()); + } } return false; } diff --git a/clang/test/AST/ByteCode/new-delete.cpp b/clang/test/AST/ByteCode/new-delete.cpp index 94fe2d4497df6a..46e32ea63544c5 100644 --- a/clang/test/AST/ByteCode/new-delete.cpp +++ b/clang/test/AST/ByteCode/new-delete.cpp @@ -274,6 +274,15 @@ namespace NowThrowNew { static_assert(erroneous_array_bound_nothrow2(-1) == 0);// expected-error {{not an integral constant expression}} static_assert(!erroneous_array_bound_nothrow2(1LL << 62));// expected-error {{not an integral constant expression}} + constexpr bool erroneous_array_bound(long long n) { + delete[] new int[n]; // both-note {{array bound -1 is negative}} both-note {{array bound 4611686018427387904 is too large}} + return true; + } + static_assert(erroneous_array_bound(3)); + static_assert(erroneous_array_bound(0)); + static_assert(erroneous_array_bound(-1)); // both-error {{constant expression}} both-note {{in call}} + static_assert(erroneous_array_bound(1LL << 62)); // both-error {{constant expression}} both-note {{in call}} + constexpr bool evaluate_nothrow_arg() { bool ok = false; delete new ((ok = true, std::nothrow)) int; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits