[clang] ccb7cc3 - [clang][bytecode] Diagnose negative array sizes differently (#114380)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 31 02:59:57 PDT 2024
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;
More information about the cfe-commits
mailing list