[clang] [clang][bytecode] Restructure Program::CurrentDeclaration handling (PR #127456)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 17 00:26:02 PST 2025
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/127456
Properly reset to the last ID and return the current ID from getCurrentDecl().
>From 9f40e18f792c8307464f7acf75f5ec9376318d5e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Mon, 17 Feb 2025 08:37:56 +0100
Subject: [PATCH] [clang][bytecode] Restructure Program::CurrentDeclaration
handling
Properly reset to the last ID and return the current ID from
getCurrentDecl().
---
clang/lib/AST/ByteCode/Compiler.cpp | 2 +-
clang/lib/AST/ByteCode/Program.h | 23 +++++++------------
.../AST/ByteCode/libcxx/global-decl-id.cpp | 22 ++++++++++++++++++
3 files changed, 31 insertions(+), 16 deletions(-)
create mode 100644 clang/test/AST/ByteCode/libcxx/global-decl-id.cpp
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;
+
More information about the cfe-commits
mailing list