[libc-commits] [libc] [libc] Fix tuple std injection in userspace builds (PR #197605)

Schrodinger ZHU Yifan via libc-commits libc-commits at lists.llvm.org
Thu May 14 22:54:45 PDT 2026


https://github.com/SchrodingerZhu updated https://github.com/llvm/llvm-project/pull/197605

>From 25cf9e1b7c8e8b874a6c80e320731625977c1012 Mon Sep 17 00:00:00 2001
From: Schrodinger ZHU Yifan <i at zhuyi.fan>
Date: Wed, 13 May 2026 22:05:33 -0400
Subject: [PATCH 1/2] [libc] Fix tuple std injection in userspace builds

---
 libc/src/__support/CPP/tuple.h | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/libc/src/__support/CPP/tuple.h b/libc/src/__support/CPP/tuple.h
index fa4fcd08cc04f..f3cac1b4b5781 100644
--- a/libc/src/__support/CPP/tuple.h
+++ b/libc/src/__support/CPP/tuple.h
@@ -125,7 +125,12 @@ LIBC_INLINE constexpr auto tuple_cat(const Tuples &...tuples) {
 } // namespace LIBC_NAMESPACE_DECL
 
 // Standard namespace definitions required for structured binding support.
+
+#ifdef _LIBCPP_BEGIN_NAMESPACE_STD
+_LIBCPP_BEGIN_NAMESPACE_STD
+#else
 namespace std {
+#endif
 
 template <class T> struct tuple_size;
 template <size_t Idx, class T> struct tuple_element;
@@ -139,6 +144,10 @@ struct tuple_element<Idx, LIBC_NAMESPACE::cpp::tuple<Ts...>>
     : LIBC_NAMESPACE::cpp::tuple_element<Idx,
                                          LIBC_NAMESPACE::cpp::tuple<Ts...>> {};
 
+#ifdef _LIBCPP_END_NAMESPACE_STD
+_LIBCPP_END_NAMESPACE_STD
+#else
 } // namespace std
+#endif
 
 #endif // LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_TUPLE_H

>From f4ca65ecfdfa65d54c3d88bb069fcd6ad5b1a423 Mon Sep 17 00:00:00 2001
From: Schrodinger ZHU Yifan <i at zhuyi.fan>
Date: Fri, 15 May 2026 01:11:17 -0400
Subject: [PATCH 2/2] avoid defining our tuple entirely when stl presents

---
 libc/cmake/modules/LLVMLibCTestRules.cmake |  4 ++-
 libc/src/__support/CPP/tuple.h             | 41 +++++++++++++---------
 2 files changed, 28 insertions(+), 17 deletions(-)

diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake
index 034396cba158c..10f7a879cfca8 100644
--- a/libc/cmake/modules/LLVMLibCTestRules.cmake
+++ b/libc/cmake/modules/LLVMLibCTestRules.cmake
@@ -29,6 +29,7 @@ function(_get_common_test_compile_options output_var c_test flags)
       list(APPEND compile_options "-fno-exceptions")
       list(APPEND compile_options "-fno-unwind-tables")
       list(APPEND compile_options "-fno-asynchronous-unwind-tables")
+      list(APPEND compile_options "-nostdinc++")
       if(NOT c_test)
         list(APPEND compile_options "-fno-rtti")
       endif()
@@ -469,7 +470,8 @@ function(add_libc_fuzzer target_name)
 
   target_compile_options(${fq_target_name}
     PRIVATE
-    ${LIBC_FUZZER_COMPILE_OPTIONS})
+    ${LIBC_FUZZER_COMPILE_OPTIONS}
+  )
 
 endfunction(add_libc_fuzzer)
 
diff --git a/libc/src/__support/CPP/tuple.h b/libc/src/__support/CPP/tuple.h
index f3cac1b4b5781..0bea46c91e270 100644
--- a/libc/src/__support/CPP/tuple.h
+++ b/libc/src/__support/CPP/tuple.h
@@ -9,6 +9,22 @@
 #ifndef LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_TUPLE_H
 #define LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_TUPLE_H
 
+#if __has_include(<tuple>)
+#include "src/__support/macros/config.h"
+#ifdef __GLIBC__
+#include <features.h>
+#endif
+#include <tuple> // NOLINT(llvmlibc-restrict-system-libc-headers)
+namespace LIBC_NAMESPACE_DECL {
+namespace cpp {
+template <typename... Ts> using tuple = std::tuple<Ts...>;
+using std::get;
+using std::make_tuple;
+using std::tie;
+using std::tuple_cat;
+} // namespace cpp
+} // namespace LIBC_NAMESPACE_DECL
+#else
 #include "src/__support/CPP/type_traits/decay.h"
 #include "src/__support/CPP/utility/integer_sequence.h"
 
@@ -125,29 +141,22 @@ LIBC_INLINE constexpr auto tuple_cat(const Tuples &...tuples) {
 } // namespace LIBC_NAMESPACE_DECL
 
 // Standard namespace definitions required for structured binding support.
-
-#ifdef _LIBCPP_BEGIN_NAMESPACE_STD
-_LIBCPP_BEGIN_NAMESPACE_STD
-#else
 namespace std {
-#endif
-
+// Add inline namespace as API tag for libc
+inline namespace LIBC_NAMESPACE_DECL {
 template <class T> struct tuple_size;
 template <size_t Idx, class T> struct tuple_element;
 
 template <typename... Ts>
-struct tuple_size<LIBC_NAMESPACE::cpp::tuple<Ts...>>
-    : LIBC_NAMESPACE::cpp::tuple_size<LIBC_NAMESPACE::cpp::tuple<Ts...>> {};
+struct tuple_size<::LIBC_NAMESPACE::cpp::tuple<Ts...>>
+    : ::LIBC_NAMESPACE::cpp::tuple_size<::LIBC_NAMESPACE::cpp::tuple<Ts...>> {};
 
 template <size_t Idx, typename... Ts>
-struct tuple_element<Idx, LIBC_NAMESPACE::cpp::tuple<Ts...>>
-    : LIBC_NAMESPACE::cpp::tuple_element<Idx,
-                                         LIBC_NAMESPACE::cpp::tuple<Ts...>> {};
-
-#ifdef _LIBCPP_END_NAMESPACE_STD
-_LIBCPP_END_NAMESPACE_STD
-#else
+struct tuple_element<Idx, ::LIBC_NAMESPACE::cpp::tuple<Ts...>>
+    : ::LIBC_NAMESPACE::cpp::tuple_element<
+          Idx, ::LIBC_NAMESPACE::cpp::tuple<Ts...>> {};
+} // namespace LIBC_NAMESPACE_DECL
 } // namespace std
-#endif
 
+#endif // __has_include(<tuple>)
 #endif // LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_TUPLE_H



More information about the libc-commits mailing list