[clang] 8608cc1 - [clang][Interp] Fix array element This chains
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 24 21:46:10 PDT 2024
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, "");
}
More information about the cfe-commits
mailing list