[llvm] [Support] Use std::conditional_t in several type traits (NFC) (PR #157791)

Kazu Hirata via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 9 21:10:34 PDT 2025


https://github.com/kazutakahirata created https://github.com/llvm/llvm-project/pull/157791

With std::conditional_t, we don't have to have two templates for each
of these type traits.


>From b6b39337690b38a6f2732d1e06272428d3b028fa Mon Sep 17 00:00:00 2001
From: Kazu Hirata <kazu at google.com>
Date: Mon, 8 Sep 2025 12:56:13 -0700
Subject: [PATCH] [Support] Use std::conditional_t in several type traits (NFC)

With std::conditional_t, we don't have to have two templates for each
of these type traits.
---
 llvm/include/llvm/Support/type_traits.h | 32 +++++++------------------
 1 file changed, 9 insertions(+), 23 deletions(-)

diff --git a/llvm/include/llvm/Support/type_traits.h b/llvm/include/llvm/Support/type_traits.h
index cb7f524447a5e..80713e17a56b9 100644
--- a/llvm/include/llvm/Support/type_traits.h
+++ b/llvm/include/llvm/Support/type_traits.h
@@ -39,35 +39,21 @@ template <typename T> class is_integral_or_enum {
 };
 
 /// If T is a pointer, just return it. If it is not, return T&.
-template <typename T, typename Enable = void>
-struct add_lvalue_reference_if_not_pointer {
-  using type = T &;
-};
-
-template <typename T>
-struct add_lvalue_reference_if_not_pointer<
-    T, std::enable_if_t<std::is_pointer_v<T>>> {
-  using type = T;
+template <typename T> struct add_lvalue_reference_if_not_pointer {
+  using type = std::conditional_t<std::is_pointer_v<T>, T, T &>;
 };
 
 /// If T is a pointer to X, return a pointer to const X. If it is not,
 /// return const T.
-template <typename T, typename Enable = void> struct add_const_past_pointer {
-  using type = const T;
+template <typename T> struct add_const_past_pointer {
+  using type = std::conditional_t<std::is_pointer_v<T>,
+                                  const std::remove_pointer_t<T> *, const T>;
 };
 
-template <typename T>
-struct add_const_past_pointer<T, std::enable_if_t<std::is_pointer_v<T>>> {
-  using type = const std::remove_pointer_t<T> *;
-};
-
-template <typename T, typename Enable = void>
-struct const_pointer_or_const_ref {
-  using type = const T &;
-};
-template <typename T>
-struct const_pointer_or_const_ref<T, std::enable_if_t<std::is_pointer_v<T>>> {
-  using type = typename add_const_past_pointer<T>::type;
+template <typename T> struct const_pointer_or_const_ref {
+  using type =
+      std::conditional_t<std::is_pointer_v<T>,
+                         typename add_const_past_pointer<T>::type, const T &>;
 };
 
 namespace detail {



More information about the llvm-commits mailing list