https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/197881
They can be initialized later, similar to extern variables. >From d93cd5bbe0cfe1d4e150308b10c15ef9d484d50b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <[email protected]> Date: Fri, 15 May 2026 08:43:02 +0200 Subject: [PATCH] asdf --- clang/lib/AST/ByteCode/Interp.cpp | 11 +++++++++-- clang/lib/AST/ByteCode/Program.cpp | 21 +++++++++------------ clang/test/AST/ByteCode/records.cpp | 10 ++++++++++ 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp index 0ac6d2f7737fc..f13720a961d68 100644 --- a/clang/lib/AST/ByteCode/Interp.cpp +++ b/clang/lib/AST/ByteCode/Interp.cpp @@ -660,8 +660,15 @@ bool DiagnoseUninitialized(InterpState &S, CodePtr OpPC, const Pointer &Ptr, bool DiagnoseUninitialized(InterpState &S, CodePtr OpPC, bool Extern, const Block *B, AccessKinds AK) { - if (Extern && S.checkingPotentialConstantExpression()) - return false; + if (S.checkingPotentialConstantExpression()) { + // Extern and static member declarations might be initialized later. + if (Extern) + return false; + + if (const VarDecl *VD = B->getDescriptor()->asVarDecl(); + VD && VD->isStaticDataMember()) + return false; + } const Descriptor *Desc = B->getDescriptor(); diff --git a/clang/lib/AST/ByteCode/Program.cpp b/clang/lib/AST/ByteCode/Program.cpp index d49903e36d34a..c0cc17b6bcd04 100644 --- a/clang/lib/AST/ByteCode/Program.cpp +++ b/clang/lib/AST/ByteCode/Program.cpp @@ -214,18 +214,15 @@ UnsignedOrNone Program::createGlobal(const ValueDecl *VD, const Expr *Init) { } if (Redecl != VD) { - if (Block *RedeclBlock = Globals[Iter->second]->block(); - RedeclBlock->isExtern()) { - - // All pointers pointing to the previous extern decl now point to the - // new decl. - // A previous iteration might've already fixed up the pointers for this - // global. - if (RedeclBlock != NewGlobal->block()) - RedeclBlock->movePointersTo(NewGlobal->block()); - - Globals[Iter->second] = NewGlobal; - } + Block *RedeclBlock = Globals[Iter->second]->block(); + // All pointers pointing to the previous extern decl now point to the + // new decl. + // A previous iteration might've already fixed up the pointers for this + // global. + if (RedeclBlock != NewGlobal->block()) + RedeclBlock->movePointersTo(NewGlobal->block()); + + Globals[Iter->second] = NewGlobal; } Iter->second = *Idx; } diff --git a/clang/test/AST/ByteCode/records.cpp b/clang/test/AST/ByteCode/records.cpp index 20ead8cffdd99..4cf532cd6e7c3 100644 --- a/clang/test/AST/ByteCode/records.cpp +++ b/clang/test/AST/ByteCode/records.cpp @@ -2011,3 +2011,13 @@ namespace RVOPtrIsExtern { } static_assert(test_all(), ""); } + +namespace StaticMemberRedecl { + class S { + public: + static const int m; + }; + constexpr int getM() { return S::m; } + const int S::m = 10; + static_assert(getM() == 10, ""); +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
