[libcxx-commits] [libcxx] [libc++] Remove libc++'s <float.h> (PR #175849)
Ian Anderson via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Jan 16 14:50:00 PST 2026
https://github.com/ian-twilightcoder updated https://github.com/llvm/llvm-project/pull/175849
>From c4978583d373a766c353b617f2ea6a68ad85c58f Mon Sep 17 00:00:00 2001
From: Ian Anderson <iana at apple.com>
Date: Tue, 16 Dec 2025 11:30:31 -0800
Subject: [PATCH] [libc++] Remove libc++'s <float.h>
The existence of <float.h> in libc++ leads to difficulties with modules, especially when it comes to supporting the various __need macros supported by the Clang builtin headers.
Fortunately, libc++'s <float.h> only defines FLT_EVAL_METHOD and DECIMAL_DIG, which are already defined by the Clang builtin headers in C++11 mode. Hence, removing the header entirely should have no impact, apart from not defining FLT_EVAL_METHOD and DECIMAL_DIG in C++03 mode. However, that is arguably something that libc++ shouldn't be doing: if the underlying C library doesn't want to provide these definitions, then libc++ shouldn't force it to.
---
libcxx/include/CMakeLists.txt | 1 -
libcxx/include/__cxx03/cfloat | 14 ++-
libcxx/include/__cxx03/module.modulemap | 4 -
libcxx/include/cfloat | 14 ++-
libcxx/include/float.h | 99 -------------------
libcxx/include/module.modulemap.in | 4 -
.../depr.c.headers/float_h.compile.pass.cpp | 8 ++
.../support.limits/c.limits/cfloat.pass.cpp | 4 +
8 files changed, 24 insertions(+), 124 deletions(-)
delete mode 100644 libcxx/include/float.h
diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index f9ae22accd687..29a2e62066324 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -1027,7 +1027,6 @@ set(files
filesystem
flat_map
flat_set
- float.h
format
forward_list
fstream
diff --git a/libcxx/include/__cxx03/cfloat b/libcxx/include/__cxx03/cfloat
index a48a213f1669f..0658f629157ef 100644
--- a/libcxx/include/__cxx03/cfloat
+++ b/libcxx/include/__cxx03/cfloat
@@ -71,14 +71,12 @@ Macros:
#include <__cxx03/__config>
-#include <float.h>
-
-#ifndef _LIBCPP_FLOAT_H
-# error <cfloat> tried including <float.h> but didn't find libc++'s <float.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.
+// <float.h> is not provided by libc++
+#if __has_include(<float.h>)
+# include <float.h>
+# ifdef _LIBCPP_FLOAT_H
+# error "If libc++ starts defining <float.h>, the __has_include check should move to libc++'s <float.h>"
+# endif
#endif
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__cxx03/module.modulemap b/libcxx/include/__cxx03/module.modulemap
index 34a2d0f25fc45..717926a46a55d 100644
--- a/libcxx/include/__cxx03/module.modulemap
+++ b/libcxx/include/__cxx03/module.modulemap
@@ -443,10 +443,6 @@ module cxx03_std_fenv_h [system] {
header "fenv.h"
export *
}
-module cxx03_std_float_h [system] {
- header "float.h"
- export *
-}
module cxx03_std_inttypes_h [system] {
header "inttypes.h"
export *
diff --git a/libcxx/include/cfloat b/libcxx/include/cfloat
index 18b4afd28ee87..82d514053352a 100644
--- a/libcxx/include/cfloat
+++ b/libcxx/include/cfloat
@@ -74,14 +74,12 @@ Macros:
#else
# include <__config>
-# include <float.h>
-
-# ifndef _LIBCPP_FLOAT_H
-# error <cfloat> tried including <float.h> but didn't find libc++'s <float.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.
+// <float.h> is not provided by libc++
+# if __has_include(<float.h>)
+# include <float.h>
+# ifdef _LIBCPP_FLOAT_H
+# error "If libc++ starts defining <float.h>, the __has_include check should move to libc++'s <float.h>"
+# endif
# endif
# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/float.h b/libcxx/include/float.h
deleted file mode 100644
index 9de29ec7392f3..0000000000000
--- a/libcxx/include/float.h
+++ /dev/null
@@ -1,99 +0,0 @@
-// -*- 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_FLOAT_H
-#define _LIBCPP_FLOAT_H
-
-/*
- float.h synopsis
-
-Macros:
-
- FLT_ROUNDS
- FLT_EVAL_METHOD // C99
- FLT_RADIX
-
- FLT_MANT_DIG
- DBL_MANT_DIG
- LDBL_MANT_DIG
-
- FLT_HAS_SUBNORM // C11
- DBL_HAS_SUBNORM // C11
- LDBL_HAS_SUBNORM // C11
-
- DECIMAL_DIG // C99
- FLT_DECIMAL_DIG // C11
- DBL_DECIMAL_DIG // C11
- LDBL_DECIMAL_DIG // C11
-
- FLT_DIG
- DBL_DIG
- LDBL_DIG
-
- FLT_MIN_EXP
- DBL_MIN_EXP
- LDBL_MIN_EXP
-
- FLT_MIN_10_EXP
- DBL_MIN_10_EXP
- LDBL_MIN_10_EXP
-
- FLT_MAX_EXP
- DBL_MAX_EXP
- LDBL_MAX_EXP
-
- FLT_MAX_10_EXP
- DBL_MAX_10_EXP
- LDBL_MAX_10_EXP
-
- FLT_MAX
- DBL_MAX
- LDBL_MAX
-
- FLT_EPSILON
- DBL_EPSILON
- LDBL_EPSILON
-
- FLT_MIN
- DBL_MIN
- LDBL_MIN
-
- FLT_TRUE_MIN // C11
- DBL_TRUE_MIN // C11
- LDBL_TRUE_MIN // C11
-
-*/
-
-#if defined(__cplusplus) && __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
-# include <__cxx03/__config>
-#else
-# include <__config>
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-# pragma GCC system_header
-#endif
-
-#if __has_include_next(<float.h>)
-# include_next <float.h>
-#endif
-
-#ifdef __cplusplus
-
-# ifndef FLT_EVAL_METHOD
-# define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
-# endif
-
-# ifndef DECIMAL_DIG
-# define DECIMAL_DIG __DECIMAL_DIG__
-# endif
-
-#endif // __cplusplus
-
-#endif // _LIBCPP_FLOAT_H
diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in
index 27178aa1f4378..58b04811e242d 100644
--- a/libcxx/include/module.modulemap.in
+++ b/libcxx/include/module.modulemap.in
@@ -2428,10 +2428,6 @@ module std_fenv_h [system] {
header "fenv.h"
export *
}
-module std_float_h [system] {
- header "float.h"
- export *
-}
module std_inttypes_h [system] {
header "inttypes.h"
export *
diff --git a/libcxx/test/std/depr/depr.c.headers/float_h.compile.pass.cpp b/libcxx/test/std/depr/depr.c.headers/float_h.compile.pass.cpp
index 8a02934350f45..dd6b6ef66fe78 100644
--- a/libcxx/test/std/depr/depr.c.headers/float_h.compile.pass.cpp
+++ b/libcxx/test/std/depr/depr.c.headers/float_h.compile.pass.cpp
@@ -7,6 +7,10 @@
//===----------------------------------------------------------------------===//
// test <float.h>
+//
+// Even though <float.h> is not provided by libc++, we still test that using it
+// with libc++ on the search path will work, and that it provides the necessary
+// content.
#include <float.h>
@@ -16,9 +20,11 @@
#error FLT_ROUNDS not defined
#endif
+#if TEST_STD_VER >= 11
#ifndef FLT_EVAL_METHOD
#error FLT_EVAL_METHOD not defined
#endif
+#endif
#ifndef FLT_RADIX
#error FLT_RADIX not defined
@@ -50,9 +56,11 @@
#error LDBL_MANT_DIG not defined
#endif
+#if TEST_STD_VER >= 11
#ifndef DECIMAL_DIG
#error DECIMAL_DIG not defined
#endif
+#endif
#if TEST_STD_VER > 14
#ifndef FLT_DECIMAL_DIG
diff --git a/libcxx/test/std/language.support/support.limits/c.limits/cfloat.pass.cpp b/libcxx/test/std/language.support/support.limits/c.limits/cfloat.pass.cpp
index 4d1a2907b228e..feb0e412232ef 100644
--- a/libcxx/test/std/language.support/support.limits/c.limits/cfloat.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/c.limits/cfloat.pass.cpp
@@ -16,9 +16,11 @@
#error FLT_ROUNDS not defined
#endif
+#if TEST_STD_VER >= 11
#ifndef FLT_EVAL_METHOD
#error FLT_EVAL_METHOD not defined
#endif
+#endif
#ifndef FLT_RADIX
#error FLT_RADIX not defined
@@ -50,9 +52,11 @@
#error LDBL_MANT_DIG not defined
#endif
+#if TEST_STD_VER >= 11
#ifndef DECIMAL_DIG
#error DECIMAL_DIG not defined
#endif
+#endif
#if TEST_STD_VER > 14
#ifndef FLT_DECIMAL_DIG
More information about the libcxx-commits
mailing list