Building a testdir of all of Gnulib on FreeBSD 13.2, I see a compilation
error:
depbase=`echo test-nullptr-c++.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`; c++
-ferror-limit=0 -DHAVE_CONFIG_H -DEXEEXT=\"\" -DEXEEXT=\"\" -I. -I../../gltests
-I.. -DGNULIB_STRICT_CHECKING=1 -DIN_GNULIB_TESTS=1 -I. -I../../gltests
-I.. -I../../gltests/.. -I../gllib -I../../gltests/../gllib
-I/home/bruno/include -I/usr/local/include -Wall -D_THREAD_SAFE -Wno-error -g
-O2 -MT test-nullptr-c++.o -MD -MP -MF $depbase.Tpo -c -o test-nullptr-c++.o
../../gltests/test-nullptr-c++.cc && mv -f $depbase.Tpo $depbase.Po
In file included from ../../gltests/test-nullptr-c++.cc:25:
In file included from /usr/include/c++/v1/iostream:37:
In file included from /usr/include/c++/v1/ios:214:
In file included from /usr/include/c++/v1/__locale:18:
In file included from /usr/include/c++/v1/memory:808:
In file included from /usr/include/c++/v1/__functional_base:26:
In file included from /usr/include/c++/v1/utility:236:
In file included from /usr/include/c++/v1/compare:144:
In file included from
/usr/include/c++/v1/__compare/compare_partial_order_fallback.h:13:
In file included from /usr/include/c++/v1/__compare/partial_order.h:14:
In file included from /usr/include/c++/v1/__compare/weak_order.h:14:
In file included from /usr/include/c++/v1/__compare/strong_order.h:18:
In file included from /usr/include/c++/v1/cmath:308:
../gllib/math.h:3144:43: error: 'isnan' is missing exception specification
'noexcept'
_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, isnan, bool)
^
/usr/include/c++/v1/math.h:554:1: note: previous declaration is here
isnan(float __lcpp_x) _NOEXCEPT { return __libcpp_isnan(__lcpp_x); }
^
In file included from ../../gltests/test-nullptr-c++.cc:25:
In file included from /usr/include/c++/v1/iostream:37:
In file included from /usr/include/c++/v1/ios:214:
In file included from /usr/include/c++/v1/__locale:18:
In file included from /usr/include/c++/v1/memory:808:
In file included from /usr/include/c++/v1/__functional_base:26:
In file included from /usr/include/c++/v1/utility:236:
In file included from /usr/include/c++/v1/compare:144:
In file included from
/usr/include/c++/v1/__compare/compare_partial_order_fallback.h:13:
In file included from /usr/include/c++/v1/__compare/partial_order.h:14:
In file included from /usr/include/c++/v1/__compare/weak_order.h:14:
In file included from /usr/include/c++/v1/__compare/strong_order.h:18:
In file included from /usr/include/c++/v1/cmath:308:
../gllib/math.h:3144:43: error: 'isnan' is missing exception specification
'noexcept'
_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, isnan, bool)
^
/usr/include/c++/v1/math.h:562:1: note: previous declaration is here
isnan(long double __lcpp_x) _NOEXCEPT { return __libcpp_isnan(__lcpp_x); }
^
2 errors generated.
Strangely, there is no compilation error in test-math-c++.cc nor
test-math-c++2.cc, only in test-nullptr-c++.cc.
This patch fixes it.
2023-04-14 Bruno Haible <[email protected]>
isnan: Fix compilation error in C++ mode on FreeBSD 13.2.
* lib/math.in.h (isnan): On FreeBSD 13.2 or newer, don't declare isnan
through _GL_MATH_CXX_REAL_FLOATING_DECL_2.
diff --git a/lib/math.in.h b/lib/math.in.h
index 1af4d54d2d..f841a1356e 100644
--- a/lib/math.in.h
+++ b/lib/math.in.h
@@ -2633,6 +2633,11 @@ _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isnan)
_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, rpl_isnan, bool)
# define isnan rpl_isnan
# define GNULIB_NAMESPACE_LACKS_ISNAN 1
+# elif (defined __FreeBSD__ && __clang_major__ >= 14)
+ /* Neither of the two possible _GL_MATH_CXX_REAL_FLOATING_DECL_2 invocations
+ works. Inline functions are already present in
/usr/include/c++/v1/math.h,
+ which comes from LLVM. */
+# define GNULIB_NAMESPACE_LACKS_ISNAN 1
# else
_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, isnan, bool)
# endif