Author: Timm Baeder Date: 2025-02-17T11:24:43+01:00 New Revision: f09fd94d6b40a80e18093fdfc7d9b199210f69fd
URL: https://github.com/llvm/llvm-project/commit/f09fd94d6b40a80e18093fdfc7d9b199210f69fd DIFF: https://github.com/llvm/llvm-project/commit/f09fd94d6b40a80e18093fdfc7d9b199210f69fd.diff LOG: [clang][bytecode] Restructure Program::CurrentDeclaration handling (#127456) Properly reset to the last ID and return the current ID from getCurrentDecl(). Added: clang/test/AST/ByteCode/libcxx/global-decl-id.cpp Modified: clang/lib/AST/ByteCode/Compiler.cpp clang/lib/AST/ByteCode/Program.h Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index 59c236c9da8c8..b3a81f8ff1516 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -29,7 +29,7 @@ namespace interp { template <class Emitter> class DeclScope final : public LocalScope<Emitter> { public: DeclScope(Compiler<Emitter> *Ctx, const ValueDecl *VD) - : LocalScope<Emitter>(Ctx, VD), Scope(Ctx->P, VD), + : LocalScope<Emitter>(Ctx, VD), Scope(Ctx->P), OldInitializingDecl(Ctx->InitializingDecl) { Ctx->InitializingDecl = VD; Ctx->InitStack.push_back(InitLink::Decl(VD)); diff --git a/clang/lib/AST/ByteCode/Program.h b/clang/lib/AST/ByteCode/Program.h index c9c3d20f198c6..d503652abb96f 100644 --- a/clang/lib/AST/ByteCode/Program.h +++ b/clang/lib/AST/ByteCode/Program.h @@ -132,20 +132,22 @@ class Program final { /// Context to manage declaration lifetimes. class DeclScope { public: - DeclScope(Program &P, const ValueDecl *VD) : P(P) { - P.startDeclaration(VD); + DeclScope(Program &P) : P(P), PrevDecl(P.CurrentDeclaration) { + ++P.LastDeclaration; + P.CurrentDeclaration = P.LastDeclaration; } - ~DeclScope() { P.endDeclaration(); } + ~DeclScope() { P.CurrentDeclaration = PrevDecl; } private: Program &P; + unsigned PrevDecl; }; /// Returns the current declaration ID. std::optional<unsigned> getCurrentDecl() const { if (CurrentDeclaration == NoDeclaration) - return std::optional<unsigned>{}; - return LastDeclaration; + return std::nullopt; + return CurrentDeclaration; } private: @@ -218,21 +220,12 @@ class Program final { } /// No declaration ID. - static constexpr unsigned NoDeclaration = (unsigned)-1; + static constexpr unsigned NoDeclaration = ~0u; /// Last declaration ID. unsigned LastDeclaration = 0; /// Current declaration ID. unsigned CurrentDeclaration = NoDeclaration; - /// Starts evaluating a declaration. - void startDeclaration(const ValueDecl *Decl) { - LastDeclaration += 1; - CurrentDeclaration = LastDeclaration; - } - - /// Ends a global declaration. - void endDeclaration() { CurrentDeclaration = NoDeclaration; } - public: /// Dumps the disassembled bytecode to \c llvm::errs(). void dump() const; diff --git a/clang/test/AST/ByteCode/libcxx/global-decl-id.cpp b/clang/test/AST/ByteCode/libcxx/global-decl-id.cpp new file mode 100644 index 0000000000000..0dd583c3d467f --- /dev/null +++ b/clang/test/AST/ByteCode/libcxx/global-decl-id.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -std=c++2c -fexperimental-new-constant-interpreter -verify=expected,both %s +// RUN: %clang_cc1 -std=c++2c -verify=ref,both %s + +// both-no-diagnostics + +namespace std { +constexpr int +midpoint(int __a, int ) { + constexpr unsigned __half_ diff = 0; + return __half_ diff ; +} +} +struct Tuple { + int min; + int mid; + constexpr Tuple() { + min = 0; + mid = std::midpoint(min, min); + } +}; +constexpr Tuple tup; + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits