[clang] 19a39e9 - [clang][bytecode] Handle non-primitive array index expressions (#128479)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 24 00:36:52 PST 2025
Author: Timm Baeder
Date: 2025-02-24T09:36:48+01:00
New Revision: 19a39e98ffdd93dce98557d07cff40cc1799f568
URL: https://github.com/llvm/llvm-project/commit/19a39e98ffdd93dce98557d07cff40cc1799f568
DIFF: https://github.com/llvm/llvm-project/commit/19a39e98ffdd93dce98557d07cff40cc1799f568.diff
LOG: [clang][bytecode] Handle non-primitive array index expressions (#128479)
By rejecting them instead of asserting in `classifyPrim()`.
Added:
Modified:
clang/lib/AST/ByteCode/Compiler.cpp
clang/test/AST/ByteCode/arrays.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 91e0484da0e58..b5745e516174d 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -1689,14 +1689,17 @@ bool Compiler<Emitter>::VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
if (!Success)
return false;
- PrimType IndexT = classifyPrim(Index->getType());
+ std::optional<PrimType> IndexT = classify(Index->getType());
+ // In error-recovery cases, the index expression has a dependent type.
+ if (!IndexT)
+ return this->emitError(E);
// If the index is first, we need to change that.
if (LHS == Index) {
- if (!this->emitFlip(PT_Ptr, IndexT, E))
+ if (!this->emitFlip(PT_Ptr, *IndexT, E))
return false;
}
- return this->emitArrayElemPtrPop(IndexT, E);
+ return this->emitArrayElemPtrPop(*IndexT, E);
}
template <class Emitter>
diff --git a/clang/test/AST/ByteCode/arrays.cpp b/clang/test/AST/ByteCode/arrays.cpp
index 4097c65f7c6fb..9204179ad1a46 100644
--- a/clang/test/AST/ByteCode/arrays.cpp
+++ b/clang/test/AST/ByteCode/arrays.cpp
@@ -654,3 +654,11 @@ namespace ZeroSizeTypes {
// both-warning {{subtraction of pointers to type 'int[0]' of zero size has undefined behavior}}
}
}
+
+namespace InvalidIndex {
+ constexpr int foo(int i) { // both-error {{no return statement in constexpr function}}
+ int a[] = {1,2,3};
+ return a[_z]; // both-error {{use of undeclared identifier}}
+ }
+ static_assert(foo(0) == 1, "");
+}
More information about the cfe-commits
mailing list