I've pushed the two patches adding a module to substitute endian.h.
Pretty much the same as last time except using inline functions
instead of macros and making sure variables are used in the m4 file.

I've only mentioned the module in the documentation. It might make
sense to put it in posix-headers/* once the next POSIX revision is
actually released. Since now it is just a draft and is subject to
change.

Right now the configure test probably fails on all platforms. POSIX
requires it to define uint16_t, uint32_t, and uint64_t but glibc
doesn't. I've submitted a bug report for that [1].

Also, the next POSIX revision seems like it is going to require
int64_t and uint64_t support [2]. I've left the 64-bit functions
#ifdef'd out though. I figured that was better since the module can be
used as a dependency or in programs who still support old systems
(assuming the 64-bit versions don't get used of course). I'm not sure
if it is worth splitting things into separate modules just for that
though.

Also I ran the test cases on GCC, Clang, and Oracle CC, all x86-64. I
don't have access to any other architectures. Someone running them on
a big endian system would be very much appreciated, to catch any typos
I may have made there. :)

Collin

[1] https://sourceware.org/bugzilla/show_bug.cgi?id=31749
[2] https://austingroupbugs.net/view.php?id=1799
From 95f7085c87236bea297f9251ecb58e0bd821552c Mon Sep 17 00:00:00 2001
From: Collin Funk <collin.fu...@gmail.com>
Date: Sat, 18 May 2024 00:10:33 -0700
Subject: [PATCH 1/2] endian: New module.

* doc/glibc-headers/endian.texi, doc/gnulib-tool.texi: Mention it.
* lib/endian.c: New file.
* lib/endian.in.h: New file.
* m4/endian_h.m4: New file.
* modules/endian: New file.
---
 ChangeLog                     |   9 ++
 doc/glibc-headers/endian.texi |   8 +-
 doc/gnulib-tool.texi          |   1 +
 lib/endian.c                  |  23 ++++
 lib/endian.in.h               | 196 ++++++++++++++++++++++++++++++++++
 m4/endian_h.m4                |  71 ++++++++++++
 modules/endian                |  44 ++++++++
 7 files changed, 348 insertions(+), 4 deletions(-)
 create mode 100644 lib/endian.c
 create mode 100644 lib/endian.in.h
 create mode 100644 m4/endian_h.m4
 create mode 100644 modules/endian

diff --git a/ChangeLog b/ChangeLog
index 8ddc85b138..4c2d9b516d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2024-05-18  Collin Funk  <collin.fu...@gmail.com>
+
+	endian: New module.
+	* doc/glibc-headers/endian.texi, doc/gnulib-tool.texi: Mention it.
+	* lib/endian.c: New file.
+	* lib/endian.in.h: New file.
+	* m4/endian_h.m4: New file.
+	* modules/endian: New file.
+
 2024-05-17  Bruno Haible  <br...@clisp.org>
 
 	tests: Fix link errors (regression today).
diff --git a/doc/glibc-headers/endian.texi b/doc/glibc-headers/endian.texi
index c45b875501..5c7cb72429 100644
--- a/doc/glibc-headers/endian.texi
+++ b/doc/glibc-headers/endian.texi
@@ -5,15 +5,15 @@ @node endian.h
 Defines the macros @code{BYTE_ORDER}, @code{LITTLE_ENDIAN}, @code{BIG_ENDIAN},
 @code{PDP_ENDIAN}.
 
-Gnulib module: ---
+Gnulib module: endian
 
 Portability problems fixed by Gnulib:
 @itemize
+@item
+This header file is missing on some platforms:
+macOS 11.1, FreeBSD 13.0, NetBSD 7.1, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, HP-UX 11, Solaris 11.4, mingw, MSVC 14.
 @end itemize
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-This header file is missing on some platforms:
-macOS 11.1, FreeBSD 13.0, NetBSD 7.1, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, HP-UX 11, Solaris 11.4, mingw, MSVC 14.
 @end itemize
diff --git a/doc/gnulib-tool.texi b/doc/gnulib-tool.texi
index 5a2fd19cac..116734f4d7 100644
--- a/doc/gnulib-tool.texi
+++ b/doc/gnulib-tool.texi
@@ -561,6 +561,7 @@ @node Style of #include statements
 @item @code{assert.h}
 @item @code{ctype.h}
 @item @code{dirent.h}
+@item @code{endian.h}
 @item @code{errno.h}
 @item @code{fcntl.h}
 @item @code{fenv.h}
diff --git a/lib/endian.c b/lib/endian.c
new file mode 100644
index 0000000000..3e7e56f523
--- /dev/null
+++ b/lib/endian.c
@@ -0,0 +1,23 @@
+/* Inline functions for <endian.h>.
+
+   Copyright 2024 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Collin Funk.  */
+
+#include <config.h>
+
+#define _GL_ENDIAN_INLINE _GL_EXTERN_INLINE
+#include <endian.h>
diff --git a/lib/endian.in.h b/lib/endian.in.h
new file mode 100644
index 0000000000..5d755fd7cf
--- /dev/null
+++ b/lib/endian.in.h
@@ -0,0 +1,196 @@
+/* endian.h - Byte order macros
+
+   Copyright 2024 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Collin Funk.  */
+
+#ifndef _GL_ENDIAN_H
+#define _GL_ENDIAN_H 1
+
+/* This file uses _GL_INLINE, WORDS_BIGENDIAN.  */
+#if !_GL_CONFIG_H_INCLUDED
+ #error "Please include config.h first."
+#endif
+
+/* Define uint16_t and uint32_t.
+   Define uint64_t if it is available.  */
+#include <stdint.h>
+
+/* Byteswap functions.  */
+#include <byteswap.h>
+
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_ENDIAN_INLINE
+# define _GL_ENDIAN_INLINE _GL_INLINE
+#endif
+
+#define LITTLE_ENDIAN 1234
+#define BIG_ENDIAN 4321
+#define PDP_ENDIAN 3412
+
+#ifdef WORDS_BIGENDIAN
+# define BYTE_ORDER BIG_ENDIAN
+#else
+# define BYTE_ORDER LITTLE_ENDIAN
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Big endian to host.  */
+
+_GL_ENDIAN_INLINE uint16_t
+be16toh (uint16_t x)
+{
+#if BYTE_ORDER == BIG_ENDIAN
+  return x;
+#else
+  return bswap_16 (x);
+#endif
+}
+
+_GL_ENDIAN_INLINE uint32_t
+be32toh (uint32_t x)
+{
+#if BYTE_ORDER == BIG_ENDIAN
+  return x;
+#else
+  return bswap_32 (x);
+#endif
+}
+
+#ifdef UINT64_MAX
+_GL_ENDIAN_INLINE uint64_t
+be64toh (uint64_t x)
+{
+# if BYTE_ORDER == BIG_ENDIAN
+  return x;
+# else
+  return bswap_64 (x);
+# endif
+}
+#endif
+
+/* Host to big endian.  */
+
+_GL_ENDIAN_INLINE uint16_t
+htobe16 (uint16_t x)
+{
+#if BYTE_ORDER == BIG_ENDIAN
+  return x;
+#else
+  return bswap_16 (x);
+#endif
+}
+
+_GL_ENDIAN_INLINE uint32_t
+htobe32 (uint32_t x)
+{
+#if BYTE_ORDER == BIG_ENDIAN
+  return x;
+#else
+  return bswap_32 (x);
+#endif
+}
+
+#ifdef UINT64_MAX
+_GL_ENDIAN_INLINE uint64_t
+htobe64 (uint64_t x)
+{
+# if BYTE_ORDER == BIG_ENDIAN
+  return x;
+# else
+  return bswap_64 (x);
+# endif
+}
+#endif
+
+/* Little endian to host.  */
+
+_GL_ENDIAN_INLINE uint16_t
+le16toh (uint16_t x)
+{
+#if BYTE_ORDER == BIG_ENDIAN
+  return bswap_16 (x);
+#else
+  return x;
+#endif
+}
+
+_GL_ENDIAN_INLINE uint32_t
+le32toh (uint32_t x)
+{
+#if BYTE_ORDER == BIG_ENDIAN
+  return bswap_32 (x);
+#else
+  return x;
+#endif
+}
+
+#ifdef UINT64_MAX
+_GL_ENDIAN_INLINE uint64_t
+le64toh (uint64_t x)
+{
+# if BYTE_ORDER == BIG_ENDIAN
+  return bswap_64 (x);
+# else
+  return x;
+# endif
+}
+#endif
+
+/* Host to little endian.  */
+
+_GL_ENDIAN_INLINE uint16_t
+htole16 (uint16_t x)
+{
+#if BYTE_ORDER == BIG_ENDIAN
+  return bswap_16 (x);
+#else
+  return x;
+#endif
+}
+
+_GL_ENDIAN_INLINE uint32_t
+htole32 (uint32_t x)
+{
+#if BYTE_ORDER == BIG_ENDIAN
+  return bswap_32 (x);
+#else
+  return x;
+#endif
+}
+
+#ifdef UINT64_MAX
+_GL_ENDIAN_INLINE uint64_t
+htole64 (uint64_t x)
+{
+# if BYTE_ORDER == BIG_ENDIAN
+  return bswap_64 (x);
+# else
+  return x;
+# endif
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _GL_ENDIAN_H */
diff --git a/m4/endian_h.m4 b/m4/endian_h.m4
new file mode 100644
index 0000000000..ec0d111ae3
--- /dev/null
+++ b/m4/endian_h.m4
@@ -0,0 +1,71 @@
+# endian_h.m4
+# serial 1
+dnl Copyright 2024 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl A placeholder for <endian.h>, for platforms that have issues.
+
+AC_DEFUN_ONCE([gl_ENDIAN_H],
+[
+  AC_REQUIRE([gl_BIGENDIAN])
+
+  AC_CHECK_HEADERS_ONCE([endian.h])
+  if test $ac_cv_header_endian_h = yes; then
+    AC_CACHE_CHECK([if endian.h conforms to POSIX],
+      [gl_cv_header_working_endian_h],
+      [gl_cv_header_working_endian_h=no
+       AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM(
+[[
+#include <endian.h>
+]],
+[[
+#if LITTLE_ENDIAN == BIG_ENDIAN
+# error "Endian macros not unique."
+#endif
+#if BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN
+# error "Byte order not defined."
+#endif
+
+/* Check for uint16_t, uint32_t, uint64_t along with
+   byte order conversion functions that accept floating-point
+   arguments.  */
+
+/* Big endian to host.  */
+uint16_t value16_1 = be16toh (0.0);
+uint32_t value32_1 = be32toh (0.0);
+uint64_t value64_1 = be64toh (0.0);
+
+/* Host to big endian.  */
+uint16_t value16_2 = htobe16 (0.0);
+uint32_t value32_2 = htobe32 (0.0);
+uint64_t value64_2 = htobe64 (0.0);
+
+/* Little endian to host.  */
+uint16_t value16_3 = le16toh (0.0);
+uint32_t value32_3 = le32toh (0.0);
+uint64_t value64_3 = le64toh (0.0);
+
+/* Host to little endian.  */
+uint16_t value16_4 = htole16 (0.0);
+uint32_t value32_4 = htole32 (0.0);
+uint64_t value64_4 = htole64 (0.0);
+
+/* Make sure the variables get used.  */
+return !(value16_1 + value32_1 + value64_1
+         + value16_2 + value32_2 + value64_2
+         + value16_3 + value32_3 + value64_3
+         + value16_4 + value32_4 + value64_4);
+]])],
+         [gl_cv_header_working_endian_h=yes],
+         [gl_cv_header_working_endian_h=no])
+      ])
+  fi
+  if test $gl_cv_header_working_endian_h = yes; then
+    GL_GENERATE_ENDIAN_H=false
+  else
+    GL_GENERATE_ENDIAN_H=true
+  fi
+])
diff --git a/modules/endian b/modules/endian
new file mode 100644
index 0000000000..9da2d2d19c
--- /dev/null
+++ b/modules/endian
@@ -0,0 +1,44 @@
+Description:
+A POSIX-like <endian.h>.
+
+Files:
+lib/endian.in.h
+lib/endian.c
+m4/endian_h.m4
+
+Depends-on:
+gen-header
+extern-inline           [$GL_GENERATE_ENDIAN_H]
+byteswap                [$GL_GENERATE_ENDIAN_H]
+stdint                  [$GL_GENERATE_ENDIAN_H]
+
+configure.ac:
+gl_ENDIAN_H
+gl_CONDITIONAL_HEADER([endian.h])
+AC_PROG_MKDIR_P
+
+Makefile.am:
+BUILT_SOURCES += $(ENDIAN_H)
+
+# We need the following in order to create <endian.h> when the system
+# doesn't have one.
+if GL_GENERATE_ENDIAN_H
+endian.h: endian.in.h $(top_builddir)/config.status
+@NMD@	$(AM_V_GEN)$(MKDIR_P) '%reldir%'
+	$(gl_V_at)$(SED_HEADER_TO_AT_t) $(srcdir)/endian.in.h
+	$(AM_V_at)mv $@-t $@
+lib_SOURCES += endian.c
+else
+endian.h: $(top_builddir)/config.status
+	rm -f $@
+endif
+MOSTLYCLEANFILES += endian.h endian.h-t
+
+Include:
+<endian.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
-- 
2.45.1

From 4d43a9182699676dda760b93e662df36abc23891 Mon Sep 17 00:00:00 2001
From: Collin Funk <collin.fu...@gmail.com>
Date: Sat, 18 May 2024 00:19:41 -0700
Subject: [PATCH 2/2] endian: Add tests.

* tests/test-endian.c: New file.
* modules/endian-tests: New file.
---
 ChangeLog            |   4 +
 modules/endian-tests |  13 +++
 tests/test-endian.c  | 203 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 220 insertions(+)
 create mode 100644 modules/endian-tests
 create mode 100644 tests/test-endian.c

diff --git a/ChangeLog b/ChangeLog
index 4c2d9b516d..217e0dd059 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2024-05-18  Collin Funk  <collin.fu...@gmail.com>
 
+	endian: Add tests.
+	* tests/test-endian.c: New file.
+	* modules/endian-tests: New file.
+
 	endian: New module.
 	* doc/glibc-headers/endian.texi, doc/gnulib-tool.texi: Mention it.
 	* lib/endian.c: New file.
diff --git a/modules/endian-tests b/modules/endian-tests
new file mode 100644
index 0000000000..8ec67a1c42
--- /dev/null
+++ b/modules/endian-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-endian.c
+tests/macros.h
+
+Depends-on:
+assert-h
+stdint
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-endian
+check_PROGRAMS += test-endian
diff --git a/tests/test-endian.c b/tests/test-endian.c
new file mode 100644
index 0000000000..919faa56f5
--- /dev/null
+++ b/tests/test-endian.c
@@ -0,0 +1,203 @@
+/* Test of <endian.h> substitute.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published
+   by the Free Software Foundation, either version 3 of the License,
+   or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Collin Funk <collin.fu...@gmail.com>, 2024.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <endian.h>
+
+/* Check for uint16_t and uint32_t.  */
+uint16_t t1;
+uint32_t t2;
+
+/* The next POSIX revision requires 64-bit types. Gnulib doesn't.  */
+#if 0
+uint64_t t3;
+#endif
+
+static_assert (LITTLE_ENDIAN != BIG_ENDIAN);
+static_assert (BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == BIG_ENDIAN);
+
+#include <stdint.h>
+
+#include "macros.h"
+
+/* Test byte order conversion functions with constant values.  */
+static void
+test_convert_constant (void)
+{
+#if BYTE_ORDER == BIG_ENDIAN
+  /* 16-bit.  */
+  ASSERT (be16toh (UINT16_C (0x1234)) == UINT16_C (0x1234));
+  ASSERT (htobe16 (UINT16_C (0x1234)) == UINT16_C (0x1234));
+  ASSERT (le16toh (UINT16_C (0x1234)) == UINT16_C (0x3412));
+  ASSERT (htole16 (UINT16_C (0x1234)) == UINT16_C (0x3412));
+
+  /* 32-bit.  */
+  ASSERT (be32toh (UINT32_C (0x12345678)) == UINT32_C (0x12345678));
+  ASSERT (htobe32 (UINT32_C (0x12345678)) == UINT32_C (0x12345678));
+  ASSERT (le32toh (UINT32_C (0x12345678)) == UINT32_C (0x78563412));
+  ASSERT (htole32 (UINT32_C (0x12345678)) == UINT32_C (0x78563412));
+
+  /* 64-bit.  */
+# ifdef UINT64_MAX
+  ASSERT (be64toh (UINT64_C (0x1234567890ABCDEF))
+          == UINT64_C (0x1234567890ABCDEF));
+  ASSERT (htobe64 (UINT64_C (0x1234567890ABCDEF))
+          == UINT64_C (0x1234567890ABCDEF));
+  ASSERT (le64toh (UINT64_C (0x1234567890ABCDEF))
+          == UINT64_C (0xEFCDAB9078563412));
+  ASSERT (htole64 (UINT64_C (0x1234567890ABCDEF))
+          == UINT64_C (0xEFCDAB9078563412));
+# endif
+#else
+  /* 16-bit.  */
+  ASSERT (be16toh (UINT16_C (0x1234)) == UINT16_C (0x3412));
+  ASSERT (htobe16 (UINT16_C (0x1234)) == UINT16_C (0x3412));
+  ASSERT (le16toh (UINT16_C (0x1234)) == UINT16_C (0x1234));
+  ASSERT (htole16 (UINT16_C (0x1234)) == UINT16_C (0x1234));
+
+  /* 32-bit.  */
+  ASSERT (be32toh (UINT32_C (0x12345678)) == UINT32_C (0x78563412));
+  ASSERT (htobe32 (UINT32_C (0x12345678)) == UINT32_C (0x78563412));
+  ASSERT (le32toh (UINT32_C (0x12345678)) == UINT32_C (0x12345678));
+  ASSERT (htole32 (UINT32_C (0x12345678)) == UINT32_C (0x12345678));
+
+  /* 64-bit.  */
+# ifdef UINT64_MAX
+  ASSERT (be64toh (UINT64_C (0x1234567890ABCDEF))
+          == UINT64_C (0xEFCDAB9078563412));
+  ASSERT (htobe64 (UINT64_C (0x1234567890ABCDEF))
+          == UINT64_C (0xEFCDAB9078563412));
+  ASSERT (le64toh (UINT64_C (0x1234567890ABCDEF))
+          == UINT64_C (0x1234567890ABCDEF));
+  ASSERT (htole64 (UINT64_C (0x1234567890ABCDEF))
+          == UINT64_C (0x1234567890ABCDEF));
+# endif
+#endif
+}
+
+/* Test that the byte order conversion functions evaluate their
+   arguments once.  */
+static void
+test_convert_eval_once (void)
+{
+  /* 16-bit.  */
+  {
+    uint16_t value = 0;
+    ASSERT (be16toh (value++) == 0);
+    ASSERT (value == 1);
+  }
+  {
+    uint16_t value = 0;
+    ASSERT (htobe16 (value++) == 0);
+    ASSERT (value == 1);
+  }
+  {
+    uint16_t value = 0;
+    ASSERT (le16toh (value++) == 0);
+    ASSERT (value == 1);
+  }
+  {
+    uint16_t value = 0;
+    ASSERT (htole16 (value++) == 0);
+    ASSERT (value == 1);
+  }
+
+  /* 32-bit.  */
+  {
+    uint32_t value = 0;
+    ASSERT (be32toh (value++) == 0);
+    ASSERT (value == 1);
+  }
+  {
+    uint32_t value = 0;
+    ASSERT (htobe32 (value++) == 0);
+    ASSERT (value == 1);
+  }
+  {
+    uint32_t value = 0;
+    ASSERT (le32toh (value++) == 0);
+    ASSERT (value == 1);
+  }
+  {
+    uint32_t value = 0;
+    ASSERT (htole32 (value++) == 0);
+    ASSERT (value == 1);
+  }
+
+  /* 64-bit.  */
+#ifdef UINT64_MAX
+  {
+    uint64_t value = 0;
+    ASSERT (be64toh (value++) == 0);
+    ASSERT (value == 1);
+  }
+  {
+    uint64_t value = 0;
+    ASSERT (htobe64 (value++) == 0);
+    ASSERT (value == 1);
+  }
+  {
+    uint64_t value = 0;
+    ASSERT (le64toh (value++) == 0);
+    ASSERT (value == 1);
+  }
+  {
+    uint64_t value = 0;
+    ASSERT (htole64 (value++) == 0);
+    ASSERT (value == 1);
+  }
+#endif
+}
+
+/* Test that the byte order conversion functions accept floating-point
+   arguments.  */
+static void
+test_convert_double (void)
+{
+  /* 16-bit.  */
+  ASSERT (be16toh (0.0) == 0);
+  ASSERT (htobe16 (0.0) == 0);
+  ASSERT (le16toh (0.0) == 0);
+  ASSERT (htole16 (0.0) == 0);
+
+  /* 32-bit.  */
+  ASSERT (be32toh (0.0) == 0);
+  ASSERT (htobe32 (0.0) == 0);
+  ASSERT (le32toh (0.0) == 0);
+  ASSERT (htole32 (0.0) == 0);
+
+  /* 64-bit.  */
+#ifdef UINT64_MAX
+  ASSERT (be64toh (0.0) == 0);
+  ASSERT (htobe64 (0.0) == 0);
+  ASSERT (le64toh (0.0) == 0);
+  ASSERT (htole64 (0.0) == 0);
+#endif
+}
+
+int
+main (void)
+{
+  test_convert_constant ();
+  test_convert_eval_once ();
+  test_convert_double ();
+
+  return 0;
+}
-- 
2.45.1

Reply via email to