Index: include/CMakeLists.txt =================================================================== --- include/CMakeLists.txt +++ include/CMakeLists.txt @@ -95,6 +95,7 @@ ext/__hash ext/hash_map ext/hash_set + fenv.h filesystem float.h forward_list Index: include/fenv.h =================================================================== --- include/fenv.h +++ include/fenv.h @@ -0,0 +1,204 @@ +// -*- C++ -*- +//===---------------------------- math.h ----------------------------------===// +// +// 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_FENV_H +#define _LIBCPP_FENV_H + + +/* + fenv.h synopsis + +This entire header is C99 / C++0X + +Macros: + + FE_DIVBYZERO + FE_INEXACT + FE_INVALID + FE_OVERFLOW + FE_UNDERFLOW + FE_ALL_EXCEPT + FE_DOWNWARD + FE_TONEAREST + FE_TOWARDZERO + FE_UPWARD + FE_DFL_ENV + +Types: + + fenv_t + fexcept_t + +int feclearexcept(int excepts); +int fegetexceptflag(fexcept_t* flagp, int excepts); +int feraiseexcept(int excepts); +int fesetexceptflag(const fexcept_t* flagp, int excepts); +int fetestexcept(int excepts); +int fegetround(); +int fesetround(int round); +int fegetenv(fenv_t* envp); +int feholdexcept(fenv_t* envp); +int fesetenv(const fenv_t* envp); +int feupdateenv(const fenv_t* envp); + + +*/ + +#include <__config> +#include_next + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#ifdef __cplusplus + +extern "C++" { + +#ifdef feclearexcept +_LIBCPP_INLINE_VISIBILITY +inline int __libcpp_feclearexcept(int __excepts) { + return feclearexcept(__excepts); +} +#undef feclearexcept +_LIBCPP_INLINE_VISIBILITY +inline int feclearexcept(int __excepts) { + return ::__libcpp_feclearexcept(__excepts); +} +#endif // defined(feclearexcept) + +#ifdef fegetexceptflag +_LIBCPP_INLINE_VISIBILITY +inline int __libcpp_fegetexceptflag(fexcept_t* __out_ptr, int __excepts) { + return fegetexceptflag(__out_ptr, __excepts); +} +#undef fegetexceptflag +_LIBCPP_INLINE_VISIBILITY +inline int fegetexceptflag(fexcept_t *__out_ptr, int __excepts) { + return ::__libcpp_fegetexceptflag(__out_ptr, __excepts); +} +#endif // defined(fegetexceptflag) + + +#ifdef feraiseexcept +_LIBCPP_INLINE_VISIBILITY +inline int __libcpp_feraiseexcept(int __excepts) { + return feraiseexcept(__excepts); +} +#undef feraiseexcept +_LIBCPP_INLINE_VISIBILITY +inline int feraiseexcept(int __excepts) { + return ::__libcpp_feraiseexcept(__excepts); +} +#endif // defined(feraiseexcept) + + +#ifdef fesetexceptflag +_LIBCPP_INLINE_VISIBILITY +inline int __libcpp_fesetexceptflag(const fexcept_t* __out_ptr, int __excepts) { + return fesetexceptflag(__out_ptr, __excepts); +} +#undef fesetexceptflag +_LIBCPP_INLINE_VISIBILITY +inline int fesetexceptflag(const fexcept_t *__out_ptr, int __excepts) { + return ::__libcpp_fesetexceptflag(__out_ptr, __excepts); +} +#endif // defined(fesetexceptflag) + + +#ifdef fetestexcept +_LIBCPP_INLINE_VISIBILITY +inline int __libcpp_fetestexcept(int __excepts) { + return fetestexcept(__excepts); +} +#undef fetestexcept +_LIBCPP_INLINE_VISIBILITY +inline int fetestexcept(int __excepts) { + return ::__libcpp_fetestexcept(__excepts); +} +#endif // defined(fetestexcept) + +#ifdef fegetround +_LIBCPP_INLINE_VISIBILITY +inline int __libcpp_fegetround() { + return fegetround(); +} +#undef fegetround +_LIBCPP_INLINE_VISIBILITY +inline int fegetround() { + return ::__libcpp_fegetround(); +} +#endif // defined(fegetround) + +#ifdef fesetround +_LIBCPP_INLINE_VISIBILITY +inline int __libcpp_fesetround(int __round) { + return fesetround(__round); +} +#undef fesetround +_LIBCPP_INLINE_VISIBILITY +inline int fesetround(int __round) { + return ::__libcpp_fesetround(__round); +} +#endif // defined(fesetround) + +#ifdef fegetenv +_LIBCPP_INLINE_VISIBILITY +inline int __libcpp_fegetenv(fenv_t* __envp) { + return fegetenv(__envp); +} +#undef fegetenv +_LIBCPP_INLINE_VISIBILITY +inline int fegetenv(fenv_t* __envp) { + return ::__libcpp_fegetenv(__envp); +} +#endif // defined(fegetenv) + +#ifdef feholdexcept +_LIBCPP_INLINE_VISIBILITY +inline int __libcpp_feholdexcept(fenv_t* __envp) { + return feholdexcept(__envp); +} +#undef feholdexcept +_LIBCPP_INLINE_VISIBILITY +inline int feholdexcept(fenv_t* __envp) { + return ::__libcpp_feholdexcept(__envp); +} +#endif // defined(feholdexcept) + + +#ifdef fesetenv +_LIBCPP_INLINE_VISIBILITY +inline int __libcpp_fesetenv(const fenv_t* __envp) { + return fesetenv(__envp); +} +#undef fesetenv +_LIBCPP_INLINE_VISIBILITY +inline int fesetenv(const fenv_t* __envp) { + return ::__libcpp_fesetenv(__envp); +} +#endif // defined(fesetenv) + +#ifdef feupdateenv +_LIBCPP_INLINE_VISIBILITY +inline int __libcpp_feupdateenv(const fenv_t* __envp) { + return feupdateenv(__envp); +} +#undef feupdateenv +_LIBCPP_INLINE_VISIBILITY +inline int feupdateenv(const fenv_t* __envp) { + return ::__libcpp_feupdateenv(__envp); +} +#endif // defined(feupdateenv) + +} // extern "C++" + +#endif // defined(__cplusplus) + +#endif // _LIBCPP_FENV_H Index: include/module.modulemap =================================================================== --- include/module.modulemap +++ include/module.modulemap @@ -24,7 +24,10 @@ header "errno.h" export * } - // provided by C library. + module fenv_h { + header "fenv.h" + export * + } // provided by compiler or C library. module inttypes_h { header "inttypes.h" Index: test/libcxx/depr/depr.c.headers/fenv.pass.cpp =================================================================== --- test/libcxx/depr/depr.c.headers/fenv.pass.cpp +++ test/libcxx/depr/depr.c.headers/fenv.pass.cpp @@ -0,0 +1,19 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +// + +#include + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} Index: test/libcxx/double_include.sh.cpp =================================================================== --- test/libcxx/double_include.sh.cpp +++ test/libcxx/double_include.sh.cpp @@ -63,6 +63,7 @@ #include #include #include +#include #include #include #include Index: test/libcxx/include_as_c.sh.cpp =================================================================== --- test/libcxx/include_as_c.sh.cpp +++ test/libcxx/include_as_c.sh.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include Index: test/std/depr/depr.c.headers/fenv_h.pass.cpp =================================================================== --- test/std/depr/depr.c.headers/fenv_h.pass.cpp +++ test/std/depr/depr.c.headers/fenv_h.pass.cpp @@ -61,17 +61,17 @@ { fenv_t fenv = {}; fexcept_t fex = 0; - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); return 0; }