https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/102454
Even if the array is of unknown bounds, index 0 is fine. >From cd0c548bda43321089d2fc4a6c7853a18b932690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Thu, 8 Aug 2024 14:19:25 +0200 Subject: [PATCH] [clang][Interp] Don't diagnose indexing arrays with index 0 Even if the array is of unknown bounds, index 0 is fine. --- clang/lib/AST/Interp/Interp.h | 4 ++-- clang/test/AST/Interp/literals.cpp | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h index 423508b3adb996..832fc028ad6696 100644 --- a/clang/lib/AST/Interp/Interp.h +++ b/clang/lib/AST/Interp/Interp.h @@ -2421,7 +2421,7 @@ inline bool ArrayElemPtr(InterpState &S, CodePtr OpPC) { const T &Offset = S.Stk.pop<T>(); const Pointer &Ptr = S.Stk.peek<Pointer>(); - if (!Ptr.isZero()) { + if (!Ptr.isZero() && !Offset.isZero()) { if (!CheckArray(S, OpPC, Ptr)) return false; } @@ -2437,7 +2437,7 @@ inline bool ArrayElemPtrPop(InterpState &S, CodePtr OpPC) { const T &Offset = S.Stk.pop<T>(); const Pointer &Ptr = S.Stk.pop<Pointer>(); - if (!Ptr.isZero()) { + if (!Ptr.isZero() && !Offset.isZero()) { if (!CheckArray(S, OpPC, Ptr)) return false; } diff --git a/clang/test/AST/Interp/literals.cpp b/clang/test/AST/Interp/literals.cpp index 815fb67b9bbfc5..a46f6ed747ec2f 100644 --- a/clang/test/AST/Interp/literals.cpp +++ b/clang/test/AST/Interp/literals.cpp @@ -1196,13 +1196,15 @@ namespace incdecbool { } #if __cplusplus >= 201402L -/// NOTE: The diagnostics of the two interpreters are a little -/// different here, but they both make sense. constexpr int externvar1() { // both-error {{never produces a constant expression}} - extern char arr[]; // ref-note {{declared here}} - return arr[0]; // ref-note {{read of non-constexpr variable 'arr'}} \ - // expected-note {{indexing of array without known bound}} + extern char arr[]; // both-note {{declared here}} + return arr[0]; // both-note {{read of non-constexpr variable 'arr'}} } +namespace externarr { + extern int arr[]; + constexpr int *externarrindex = &arr[0]; /// No diagnostic. +} + namespace StmtExprs { constexpr int foo() { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits