[clang] f09fd94 - [clang][bytecode] Restructure Program::CurrentDeclaration handling (#127456)

via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 17 02:24:47 PST 2025


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;
+


        


More information about the cfe-commits mailing list