Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Apr 2026 14:20:00 +0000
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 00bee6fcd77f - main - Partially revert libc++ commit aa7f377c965c, restoring stdint.h
Message-ID:  <69eccd90.3805f.68f3d50d@gitrepo.freebsd.org>

index | next in thread | raw e-mail

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"


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69eccd90.3805f.68f3d50d>