[clang] [llvm] [clang][ssaf] Fix instantiations of `Registry<TUSummaryExtractor, TUSummaryBuilder &>` (PR #176730)
Tomohiro Kashiwada via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 21 02:59:46 PST 2026
https://github.com/kikairoya updated https://github.com/llvm/llvm-project/pull/176730
>From 090de35439d737bc7b1b80bc5fe12438ad9076d2 Mon Sep 17 00:00:00 2001
From: kikairoya <kikairoya at gmail.com>
Date: Mon, 19 Jan 2026 19:52:00 +0900
Subject: [PATCH 1/2] [clang][ssaf] Fix instantiation of
`Registry<TUSummaryExtractor, TUSummaryBuilder &>`
---
.../clang/Analysis/Scalable/TUSummary/ExtractorRegistry.h | 2 +-
clang/lib/Analysis/Scalable/TUSummary/ExtractorRegistry.cpp | 5 ++++-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/clang/include/clang/Analysis/Scalable/TUSummary/ExtractorRegistry.h b/clang/include/clang/Analysis/Scalable/TUSummary/ExtractorRegistry.h
index 13331b3673192..29f5925ed6af6 100644
--- a/clang/include/clang/Analysis/Scalable/TUSummary/ExtractorRegistry.h
+++ b/clang/include/clang/Analysis/Scalable/TUSummary/ExtractorRegistry.h
@@ -42,7 +42,7 @@ using TUSummaryExtractorRegistry =
namespace llvm {
extern template class CLANG_TEMPLATE_ABI
- Registry<clang::ssaf::TUSummaryExtractorRegistry>;
+ Registry<clang::ssaf::TUSummaryExtractor, clang::ssaf::TUSummaryBuilder &>;
} // namespace llvm
#endif // LLVM_CLANG_ANALYSIS_SCALABLE_TUSUMMARY_EXTRACTORREGISTRY_H
diff --git a/clang/lib/Analysis/Scalable/TUSummary/ExtractorRegistry.cpp b/clang/lib/Analysis/Scalable/TUSummary/ExtractorRegistry.cpp
index 91eede1bebc77..8e3871126a2b3 100644
--- a/clang/lib/Analysis/Scalable/TUSummary/ExtractorRegistry.cpp
+++ b/clang/lib/Analysis/Scalable/TUSummary/ExtractorRegistry.cpp
@@ -12,7 +12,10 @@
using namespace clang;
using namespace ssaf;
-LLVM_INSTANTIATE_REGISTRY(TUSummaryExtractorRegistry)
+// FIXME: LLVM_INSTANTIATE_REGISTRY can't be used here because it drops extra
+// type parameters.
+template class CLANG_EXPORT_TEMPLATE
+ llvm::Registry<TUSummaryExtractor, TUSummaryBuilder &>;
bool ssaf::isTUSummaryExtractorRegistered(llvm::StringRef SummaryName) {
for (const auto &Entry : TUSummaryExtractorRegistry::entries())
>From 9c162a2d845e319abcb2bf456b6e913812af8412 Mon Sep 17 00:00:00 2001
From: kikairoya <kikairoya at gmail.com>
Date: Wed, 21 Jan 2026 19:46:56 +0900
Subject: [PATCH 2/2] add checks in Registry
---
llvm/include/llvm/Support/Registry.h | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/llvm/include/llvm/Support/Registry.h b/llvm/include/llvm/Support/Registry.h
index 2c4a709e22960..ed1c6a5f08153 100644
--- a/llvm/include/llvm/Support/Registry.h
+++ b/llvm/include/llvm/Support/Registry.h
@@ -40,13 +40,25 @@ template <typename T, typename... CtorParamTypes> class SimpleRegistryEntry {
}
};
+template <typename T, typename... CtorParamTypes> class Registry;
+namespace detail {
+template <typename R> struct IsRegistryType : std::false_type {};
+template <typename T, typename... CtorParamTypes>
+struct IsRegistryType<Registry<T, CtorParamTypes...>> : std::true_type {};
+} // namespace detail
+
/// A global registry used in conjunction with static constructors to make
/// pluggable components (like targets or garbage collectors) "just work" when
/// linked with an executable.
template <typename T, typename... CtorParamTypes> class Registry {
+ static_assert(
+ !detail::IsRegistryType<T>::value,
+ "Trying to instantiate a wrong specialization 'Registry<Registry<...>>'");
+
public:
using type = T;
using entry = SimpleRegistryEntry<T, CtorParamTypes...>;
+ static constexpr bool HasCtorParamTypes = sizeof...(CtorParamTypes) != 0;
class node;
class iterator;
@@ -147,11 +159,17 @@ template <typename T, typename... CtorParamTypes> class Registry {
#define LLVM_INSTANTIATE_REGISTRY(REGISTRY_CLASS) \
namespace llvm { \
template class LLVM_ABI_EXPORT Registry<REGISTRY_CLASS::type>; \
+ static_assert(!REGISTRY_CLASS::HasCtorParamTypes, \
+ "LLVM_INSTANTIATE_REGISTRY can't be used with extra " \
+ "constructor parameter types"); \
}
#else
#define LLVM_INSTANTIATE_REGISTRY(REGISTRY_CLASS) \
namespace llvm { \
template class Registry<REGISTRY_CLASS::type>; \
+ static_assert(!REGISTRY_CLASS::HasCtorParamTypes, \
+ "LLVM_INSTANTIATE_REGISTRY can't be used with extra " \
+ "constructor parameter types"); \
}
#endif
More information about the cfe-commits
mailing list