Author: Timm Bäder Date: 2024-07-24T19:15:10+02:00 New Revision: bb0300cf7ce54bfbb1607348c89cb0525e12076b
URL: https://github.com/llvm/llvm-project/commit/bb0300cf7ce54bfbb1607348c89cb0525e12076b DIFF: https://github.com/llvm/llvm-project/commit/bb0300cf7ce54bfbb1607348c89cb0525e12076b.diff LOG: [clang][Interp] Fix initializing array subobjects with This pointers We need to select the right array element once we see the CXXThisExpr. Added: Modified: clang/lib/AST/Interp/Compiler.cpp clang/lib/AST/Interp/Compiler.h clang/test/AST/Interp/records.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/Compiler.cpp b/clang/lib/AST/Interp/Compiler.cpp index 58a0852aca755..4d5d725d6964c 100644 --- a/clang/lib/AST/Interp/Compiler.cpp +++ b/clang/lib/AST/Interp/Compiler.cpp @@ -89,6 +89,10 @@ bool InitLink::emit(Compiler<Emitter> *Ctx, const Expr *E) const { return Ctx->emitGetPtrLocal(Offset, E); case K_Decl: return Ctx->visitDeclRef(D, E); + case K_Elem: + if (!Ctx->emitConstUint32(Offset, E)) + return false; + return Ctx->emitArrayElemPtrUint32(E); default: llvm_unreachable("Unhandled InitLink kind"); } @@ -1556,6 +1560,7 @@ bool Compiler<Emitter>::visitArrayElemInit(unsigned ElemIndex, return this->emitInitElem(*T, ElemIndex, Init); } + InitLinkScope<Emitter> ILS(this, InitLink::Elem(ElemIndex)); // Advance the pointer currently on the stack to the given // dimension. if (!this->emitConstUint32(ElemIndex, Init)) diff --git a/clang/lib/AST/Interp/Compiler.h b/clang/lib/AST/Interp/Compiler.h index 084f5aef25f8e..d22b29d29a92d 100644 --- a/clang/lib/AST/Interp/Compiler.h +++ b/clang/lib/AST/Interp/Compiler.h @@ -50,6 +50,7 @@ struct InitLink { K_Field = 1, K_Temp = 2, K_Decl = 3, + K_Elem = 5, }; static InitLink This() { return InitLink{K_This}; } @@ -68,6 +69,11 @@ struct InitLink { IL.D = D; return IL; } + static InitLink Elem(unsigned Index) { + InitLink IL{K_Elem}; + IL.Offset = Index; + return IL; + } InitLink(uint8_t Kind) : Kind(Kind) {} template <class Emitter> diff --git a/clang/test/AST/Interp/records.cpp b/clang/test/AST/Interp/records.cpp index 2fc88a0b1df6a..d77e5a5c782ce 100644 --- a/clang/test/AST/Interp/records.cpp +++ b/clang/test/AST/Interp/records.cpp @@ -1537,3 +1537,22 @@ namespace BitSet { Bitset() }; } + +namespace ArrayInitChain { + struct StringLiteral { + const char *S; + }; + + struct CustomOperandVal { + StringLiteral Str; + unsigned Width; + unsigned Mask = Width + 1; + }; + + constexpr CustomOperandVal A[] = { + {}, + }; + static_assert(A[0].Str.S == nullptr, ""); + static_assert(A[0].Width == 0, ""); + static_assert(A[0].Mask == 1, ""); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits