git: 00bee6fcd77f - main - Partially revert libc++ commit aa7f377c965c, restoring stdint.h
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 25 Apr 2026 14:20:00 UTC
The branch main has been updated by dim:
URL: https://cgit.FreeBSD.org/src/commit/?id=00bee6fcd77f7812e967f85d1cacbc349ff312b3
commit 00bee6fcd77f7812e967f85d1cacbc349ff312b3
Author: Dimitry Andric <dim@FreeBSD.org>
AuthorDate: 2025-12-30 19:49:35 +0000
Commit: Dimitry Andric <dim@FreeBSD.org>
CommitDate: 2026-04-25 14:14:11 +0000
Partially revert libc++ commit aa7f377c965c, restoring stdint.h
This partially reverts upstream libc++ commit aa7f377c965c:
[libc++] Remove libc++'s own stdint.h and locale.h (#107436)
These headers are not doing anything beyond the system or compiler
provided equivalent headers, so there's no real reason to keep them
around. Reducing the number of C headers we provide in libc++ simplifies
our header layering and reduces the potential for confusion when headers
are layered incorrectly.
The problem is that libc++'s own `stdint.h` _does_ do something: it
defines `__STDC_LIMIT_MACROS` and `__STDC_CONSTANT_MACROS` before
including the system `stdint.h`, causing the latter to expose macros
like `SIZE_MAX`, `UINT64_C`, and others.
If the `__STDC_LIMIT_MACROS` and `__STDC_CONSTANT_MACROS` macros are not
exposed, C++ programs compiled for standards before C++11 can fail with
errors due to those macros not being available.
PR: 292067
MFC after: 1 month
---
ObsoleteFiles.inc | 1 -
contrib/llvm-project/libcxx/include/cstdint | 8 ++
contrib/llvm-project/libcxx/include/stdint.h | 127 +++++++++++++++++++++++++++
lib/libc++/Makefile | 1 +
lib/libc++/module.modulemap | 4 +
5 files changed, 140 insertions(+), 1 deletion(-)
diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc
index 971800b70dab..89112e17835f 100644
--- a/ObsoleteFiles.inc
+++ b/ObsoleteFiles.inc
@@ -492,7 +492,6 @@ OLD_FILES+=usr/include/c++/v1/__type_traits/is_unsigned_integer.h
OLD_FILES+=usr/include/c++/v1/__type_traits/noexcept_move_assign_container.h
OLD_FILES+=usr/include/c++/v1/experimental/__config
OLD_FILES+=usr/include/c++/v1/locale.h
-OLD_FILES+=usr/include/c++/v1/stdint.h
# 20260420: remove perfmon
OLD_FILES+=boot/kernel/perfmon.ko
diff --git a/contrib/llvm-project/libcxx/include/cstdint b/contrib/llvm-project/libcxx/include/cstdint
index 11839eeb071e..7ae82f656fc9 100644
--- a/contrib/llvm-project/libcxx/include/cstdint
+++ b/contrib/llvm-project/libcxx/include/cstdint
@@ -149,6 +149,14 @@ Types:
# include <stdint.h>
# endif
+# ifndef _LIBCPP_STDINT_H
+# error <cstdint> tried including <stdint.h> but didn't find libc++'s <stdint.h> header. \
+ This usually means that your header search paths are not configured properly. \
+ The header search paths should contain the C++ Standard Library headers before \
+ any C Standard Library, and you are probably using compiler flags that make that \
+ not be the case.
+# endif
+
# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
# endif
diff --git a/contrib/llvm-project/libcxx/include/stdint.h b/contrib/llvm-project/libcxx/include/stdint.h
new file mode 100644
index 000000000000..35e5b8cbdad2
--- /dev/null
+++ b/contrib/llvm-project/libcxx/include/stdint.h
@@ -0,0 +1,127 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP_STDINT_H
+// AIX system headers need stdint.h to be re-enterable while _STD_TYPES_T
+// is defined until an inclusion of it without _STD_TYPES_T occurs, in which
+// case the header guard macro is defined.
+#if !defined(_AIX) || !defined(_STD_TYPES_T)
+# define _LIBCPP_STDINT_H
+#endif // _STD_TYPES_T
+
+/*
+ stdint.h synopsis
+
+Macros:
+
+ INT8_MIN
+ INT16_MIN
+ INT32_MIN
+ INT64_MIN
+
+ INT8_MAX
+ INT16_MAX
+ INT32_MAX
+ INT64_MAX
+
+ UINT8_MAX
+ UINT16_MAX
+ UINT32_MAX
+ UINT64_MAX
+
+ INT_LEAST8_MIN
+ INT_LEAST16_MIN
+ INT_LEAST32_MIN
+ INT_LEAST64_MIN
+
+ INT_LEAST8_MAX
+ INT_LEAST16_MAX
+ INT_LEAST32_MAX
+ INT_LEAST64_MAX
+
+ UINT_LEAST8_MAX
+ UINT_LEAST16_MAX
+ UINT_LEAST32_MAX
+ UINT_LEAST64_MAX
+
+ INT_FAST8_MIN
+ INT_FAST16_MIN
+ INT_FAST32_MIN
+ INT_FAST64_MIN
+
+ INT_FAST8_MAX
+ INT_FAST16_MAX
+ INT_FAST32_MAX
+ INT_FAST64_MAX
+
+ UINT_FAST8_MAX
+ UINT_FAST16_MAX
+ UINT_FAST32_MAX
+ UINT_FAST64_MAX
+
+ INTPTR_MIN
+ INTPTR_MAX
+ UINTPTR_MAX
+
+ INTMAX_MIN
+ INTMAX_MAX
+
+ UINTMAX_MAX
+
+ PTRDIFF_MIN
+ PTRDIFF_MAX
+
+ SIG_ATOMIC_MIN
+ SIG_ATOMIC_MAX
+
+ SIZE_MAX
+
+ WCHAR_MIN
+ WCHAR_MAX
+
+ WINT_MIN
+ WINT_MAX
+
+ INT8_C(value)
+ INT16_C(value)
+ INT32_C(value)
+ INT64_C(value)
+
+ UINT8_C(value)
+ UINT16_C(value)
+ UINT32_C(value)
+ UINT64_C(value)
+
+ INTMAX_C(value)
+ UINTMAX_C(value)
+
+*/
+
+#include <__config>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+# pragma GCC system_header
+#endif
+
+/* C99 stdlib (e.g. glibc < 2.18) does not provide macros needed
+ for C++11 unless __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS
+ are defined
+*/
+#if defined(__cplusplus) && !defined(__STDC_LIMIT_MACROS)
+# define __STDC_LIMIT_MACROS
+#endif
+#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS)
+# define __STDC_CONSTANT_MACROS
+#endif
+
+#if __has_include_next(<stdint.h>)
+# include_next <stdint.h>
+#endif
+
+#endif // _LIBCPP_STDINT_H
diff --git a/lib/libc++/Makefile b/lib/libc++/Makefile
index 4e487f0e8457..03b04afee7cc 100644
--- a/lib/libc++/Makefile
+++ b/lib/libc++/Makefile
@@ -232,6 +232,7 @@ STD_HEADERS+= stdatomic.h
STD_HEADERS+= stdbool.h
STD_HEADERS+= stddef.h
STD_HEADERS+= stdexcept
+STD_HEADERS+= stdint.h
STD_HEADERS+= stdio.h
STD_HEADERS+= stdlib.h
STD_HEADERS+= stop_token
diff --git a/lib/libc++/module.modulemap b/lib/libc++/module.modulemap
index a6e6059ab60e..90d61bf5f44a 100644
--- a/lib/libc++/module.modulemap
+++ b/lib/libc++/module.modulemap
@@ -2433,6 +2433,10 @@ module std_stddef_h [system] {
// <stddef.h> supports being included multiple times with different pre-defined macros
textual header "stddef.h"
}
+module std_stdint_h [system] {
+ // <stdint.h> supports being included multiple times with different pre-defined macros
+ textual header "stdint.h"
+}
module std_stdio_h [system] {
// <stdio.h> supports being included multiple times with different pre-defined macros
textual header "stdio.h"