[clang] [clang][bytecode] Handle non-primitive array index expressions (PR #128479)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 24 00:07:11 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Timm Baeder (tbaederr)
<details>
<summary>Changes</summary>
By rejecting them instead of asserting in `classifyPrim()`.
---
Full diff: https://github.com/llvm/llvm-project/pull/128479.diff
2 Files Affected:
- (modified) clang/lib/AST/ByteCode/Compiler.cpp (+6-3)
- (modified) clang/test/AST/ByteCode/arrays.cpp (+8)
``````````diff
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, "");
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/128479
More information about the cfe-commits
mailing list