Author: Timm Bäder Date: 2024-07-25T06:45:48+02:00 New Revision: 8608cc1c89640bd3d8120f24c964af21310253b6
URL: https://github.com/llvm/llvm-project/commit/8608cc1c89640bd3d8120f24c964af21310253b6 DIFF: https://github.com/llvm/llvm-project/commit/8608cc1c89640bd3d8120f24c964af21310253b6.diff LOG: [clang][Interp] Fix array element This chains The previous test was too minimal. If we actually do something after initializing the nested array element, we end up causing a stack element type mismatch. Added: Modified: clang/lib/AST/Interp/Compiler.cpp clang/test/AST/Interp/records.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/Compiler.cpp b/clang/lib/AST/Interp/Compiler.cpp index 4d5d725d6964c..df55d01b8b9d6 100644 --- a/clang/lib/AST/Interp/Compiler.cpp +++ b/clang/lib/AST/Interp/Compiler.cpp @@ -92,7 +92,7 @@ bool InitLink::emit(Compiler<Emitter> *Ctx, const Expr *E) const { case K_Elem: if (!Ctx->emitConstUint32(Offset, E)) return false; - return Ctx->emitArrayElemPtrUint32(E); + return Ctx->emitArrayElemPtrPopUint32(E); default: llvm_unreachable("Unhandled InitLink kind"); } @@ -4156,7 +4156,8 @@ bool Compiler<Emitter>::VisitCXXThisExpr(const CXXThisExpr *E) { if (InitStackActive && !InitStack.empty()) { unsigned StartIndex = 0; for (StartIndex = InitStack.size() - 1; StartIndex > 0; --StartIndex) { - if (InitStack[StartIndex].Kind != InitLink::K_Field) + if (InitStack[StartIndex].Kind != InitLink::K_Field && + InitStack[StartIndex].Kind != InitLink::K_Elem) break; } diff --git a/clang/test/AST/Interp/records.cpp b/clang/test/AST/Interp/records.cpp index d77e5a5c782ce..9551630caf3d6 100644 --- a/clang/test/AST/Interp/records.cpp +++ b/clang/test/AST/Interp/records.cpp @@ -1551,8 +1551,12 @@ namespace ArrayInitChain { constexpr CustomOperandVal A[] = { {}, + {{"depctr_hold_cnt"}, 12, 13}, }; static_assert(A[0].Str.S == nullptr, ""); static_assert(A[0].Width == 0, ""); static_assert(A[0].Mask == 1, ""); + + static_assert(A[1].Width == 12, ""); + static_assert(A[1].Mask == 13, ""); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits