[libcxx-commits] [libcxx] Speed up compilation of common uses of std::visit() by ~8x (PR #164196)

via libcxx-commits libcxx-commits at lists.llvm.org
Sun Oct 19 19:02:43 PDT 2025


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff origin/main HEAD --extensions  -- libcxx/include/variant --diff_from_common_commit
``````````

:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/libcxx/include/variant b/libcxx/include/variant
index ef5bca4c2..cb8a72ddd 100644
--- a/libcxx/include/variant
+++ b/libcxx/include/variant
@@ -1579,21 +1579,18 @@ _LIBCPP_HIDE_FROM_ABI constexpr void __throw_if_valueless(_Vs&&... __vs) {
 }
 
 template <class _Visitor, class... _Vs, typename>
-_LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) visit(_Visitor&& __visitor,
-                                                     _Vs&&... __vs) {
-#define _XDispatchIndex(_I)                                              \
-  case _I:                                                               \
-    if constexpr (__variant_size::value > _I) {                          \
-      return __visitor(                                                  \
-          __variant::__get_alt<_I>(std::forward<_Vs>(__vs)...).__value); \
-    }                                                                    \
-    [[__fallthrough__]]
-#define _XDispatchMax 7 // Speed up compilation for the common cases
+_LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) visit(_Visitor&& __visitor, _Vs&&... __vs) {
+#    define _XDispatchIndex(_I)                                                                                        \
+    case _I:                                                                                                           \
+      if constexpr (__variant_size::value > _I) {                                                                      \
+        return __visitor(__variant::__get_alt<_I>(std::forward<_Vs>(__vs)...).__value);                                \
+      }                                                                                                                \
+      [[__fallthrough__]]
+#    define _XDispatchMax 7 // Speed up compilation for the common cases
   if constexpr (sizeof...(_Vs) == 1) {
-    if constexpr (variant_size<__remove_cvref_t<_Vs>...>::value <=
-                  _XDispatchMax) {
+    if constexpr (variant_size<__remove_cvref_t<_Vs>...>::value <= _XDispatchMax) {
       using __variant_detail::__access::__variant;
-      using __variant_size = variant_size<__remove_cvref_t<_Vs>...>;
+      using __variant_size     = variant_size<__remove_cvref_t<_Vs>...>;
       const size_t __indexes[] = {__vs.index()...};
       switch (__indexes[0]) {
         _XDispatchIndex(_XDispatchMax - 7);
@@ -1604,22 +1601,19 @@ _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) visit(_Visitor&& __visitor,
         _XDispatchIndex(_XDispatchMax - 2);
         _XDispatchIndex(_XDispatchMax - 1);
         _XDispatchIndex(_XDispatchMax - 0);
-        default:
-          __throw_bad_variant_access();
+      default:
+        __throw_bad_variant_access();
       }
     } else {
-      static_assert(
-          variant_size<__remove_cvref_t<_Vs>...>::value > _XDispatchMax,
-          "forgot to add dispatch case");
+      static_assert(variant_size<__remove_cvref_t<_Vs>...>::value > _XDispatchMax, "forgot to add dispatch case");
     }
   } else {
     using __variant_detail::__visitation::__variant;
     std::__throw_if_valueless(std::forward<_Vs>(__vs)...);
-    return __variant::__visit_value(std::forward<_Visitor>(__visitor),
-                                    std::forward<_Vs>(__vs)...);
+    return __variant::__visit_value(std::forward<_Visitor>(__visitor), std::forward<_Vs>(__vs)...);
   }
-#undef _XDispatchMax
-#undef _XDispatchIndex
+#    undef _XDispatchMax
+#    undef _XDispatchIndex
 }
 
 #    if _LIBCPP_STD_VER >= 20

``````````

</details>


https://github.com/llvm/llvm-project/pull/164196


More information about the libcxx-commits mailing list