[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