[clang] [clang][bytecode] Use first decl in redeclaration chain to cache dummy pointers (PR #208377)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 8 21:52:56 PDT 2026
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/208377
None
>From c21b83cf6bafb7db3ede0ab34ef0cdcb15caf1fe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Thu, 9 Jul 2026 06:21:05 +0200
Subject: [PATCH] redecl2
---
clang/lib/AST/ByteCode/Program.cpp | 6 +++-
clang/lib/AST/ByteCode/Program.h | 2 +-
.../test/AST/ByteCode/module-dummy-redecl.cpp | 33 +++++++++++++++++++
3 files changed, 39 insertions(+), 2 deletions(-)
create mode 100644 clang/test/AST/ByteCode/module-dummy-redecl.cpp
diff --git a/clang/lib/AST/ByteCode/Program.cpp b/clang/lib/AST/ByteCode/Program.cpp
index 1427724ec427c..d73011a8d8dc4 100644
--- a/clang/lib/AST/ByteCode/Program.cpp
+++ b/clang/lib/AST/ByteCode/Program.cpp
@@ -124,8 +124,12 @@ UnsignedOrNone Program::getOrCreateGlobal(const ValueDecl *VD,
return std::nullopt;
}
-unsigned Program::getOrCreateDummy(const DeclTy &D, bool IsConstexprUnknown) {
+unsigned Program::getOrCreateDummy(DeclTy D, bool IsConstexprUnknown) {
assert(D);
+
+ if (const auto *VD = dyn_cast_if_present<VarDecl>(dyn_cast<const Decl *>(D)))
+ D = VD->getFirstDecl();
+
// Dedup blocks since they are immutable and pointers cannot be compared.
if (auto It = DummyVariables.find(D.getOpaqueValue());
It != DummyVariables.end())
diff --git a/clang/lib/AST/ByteCode/Program.h b/clang/lib/AST/ByteCode/Program.h
index c98c5c0e51a24..b0ef993258637 100644
--- a/clang/lib/AST/ByteCode/Program.h
+++ b/clang/lib/AST/ByteCode/Program.h
@@ -88,7 +88,7 @@ class Program final {
const Expr *Init = nullptr);
/// Returns or creates a dummy value for unknown declarations.
- unsigned getOrCreateDummy(const DeclTy &D, bool IsConstexprUnknown = false);
+ unsigned getOrCreateDummy(DeclTy D, bool IsConstexprUnknown = false);
/// Creates a global and returns its index.
UnsignedOrNone createGlobal(const ValueDecl *VD, const Expr *Init,
diff --git a/clang/test/AST/ByteCode/module-dummy-redecl.cpp b/clang/test/AST/ByteCode/module-dummy-redecl.cpp
new file mode 100644
index 0000000000000..5519ac33c2a0a
--- /dev/null
+++ b/clang/test/AST/ByteCode/module-dummy-redecl.cpp
@@ -0,0 +1,33 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 -fmodules -fmodules-cache-path=%t -fmodule-map-file=%t/module.modulemap %t/use.cpp -emit-llvm -o - -triple x86_64-linux-gnu
+// RUN: %clang_cc1 -std=c++20 -fmodules -fmodules-cache-path=%t -fmodule-map-file=%t/module.modulemap %t/use.cpp -emit-llvm -o - -triple x86_64-linux-gnu -fexperimental-new-constant-interpreter
+
+//--- module.modulemap
+module b { header "b.h" export * }
+module c { header "c.h" export * }
+
+//--- nonmodular.h
+template<typename T> int Z;
+
+//--- b.h
+#include "nonmodular.h"
+
+inline constexpr int *xP = &Z<decltype([] { static int n; return &n; }())>;
+
+//--- c.h
+#include "nonmodular.h"
+
+inline constexpr int *yP = &Z<decltype([] { static int n; return &n; }())>;
+
+
+//--- use.cpp
+#include "nonmodular.h"
+
+inline constexpr int *P = &Z<decltype([] { static int n; return &n; }())>;
+
+#include "b.h"
+#include "c.h"
+static_assert(xP == yP);
More information about the cfe-commits
mailing list