[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