[libc++] Remove libc++'s <float.h> (#175849)

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.
This commit is contained in:
Ian Anderson
2026-01-19 12:12:40 -08:00
committed by GitHub
parent 4d2af858f6
commit 501645cbeb
8 changed files with 24 additions and 124 deletions

View File

@@ -1027,7 +1027,6 @@ set(files
filesystem
flat_map
flat_set
float.h
format
forward_list
fstream

View File

@@ -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)

View File

@@ -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 *

View File

@@ -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)

View File

@@ -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

View File

@@ -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 *

View File

@@ -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

View File

@@ -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