Author: Timm Baeder Date: 2024-10-31T10:59:53+01:00 New Revision: ccb7cc319f8ea07bb64c2efb0c4f1e42076ef446
URL: https://github.com/llvm/llvm-project/commit/ccb7cc319f8ea07bb64c2efb0c4f1e42076ef446 DIFF: https://github.com/llvm/llvm-project/commit/ccb7cc319f8ea07bb64c2efb0c4f1e42076ef446.diff LOG: [clang][bytecode] Diagnose negative array sizes differently (#114380) We have a special diagnostic ID for this. Added: Modified: clang/lib/AST/ByteCode/Interp.h clang/test/AST/ByteCode/new-delete.cpp Removed: ################################################################################ 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 31c8da93a3a643..8466e9b88782f2 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