[PATCH] libstdc++: Implement LWG 4440 feature-test macros added to <iosfwd>

Jonathan Wakely jwakely@redhat.com
Fri Jul 31 15:10:35 GMT 2026


On Fri, 31 Jul 2026 at 14:29, Patrick Palka <ppalka@redhat.com> wrote:
>
> On Fri, 31 Jul 2026, Tomasz Kaminski wrote:
>
> >
> >
> > On Fri, Jul 31, 2026 at 3:14 PM Patrick Palka <ppalka@redhat.com> wrote:
> >       Tested on x86_64-pc-linux-gnu, does this look OK for trunk and
> >       backports?
> >
> >       -- >8 --
> >
> >       Note __cpp_lib_char8_t doesn't use the <bits/version.h> mechanism, it's
> >       defined in c++config and thus provided by all headers by default.
> >
> >       libstdc++-v3/ChangeLog:
> >
> >               * include/std/iosfwd: Provide feature-test macros
> >               __cpp_lib_spanstream and __cpp_lib_syncbuf.
> >               * testsuite/27_io/headers/iosfwd/synopsis.cc: Verify values
> >               of these FTMs.
> >       ---
> >        libstdc++-v3/include/std/iosfwd                         | 4 ++++
> >        libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc | 8 ++++++++
> >        2 files changed, 12 insertions(+)
> >
> >       diff --git a/libstdc++-v3/include/std/iosfwd b/libstdc++-v3/include/std/iosfwd
> >       index 1d5e684b53bb..511b2f3a23f1 100644
> >       --- a/libstdc++-v3/include/std/iosfwd
> >       +++ b/libstdc++-v3/include/std/iosfwd
> >       @@ -39,6 +39,10 @@
> >
> >        #include <bits/requires_hosted.h> // iostreams
> >
> >       +#define __glibcxx_want_spanstream
> >       +#define __glibcxx_want_syncbuf
> >       +#include <bits/version.h>
> >       +
> >          /**
> >           *  @defgroup io I/O
> >           *
> >       diff --git a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> >       index 8d9501f42ef4..f39a0b95a3d6 100644
> >       --- a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> >       +++ b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> >       @@ -3,6 +3,14 @@
> >
> >        #include <iosfwd>
> >
> >       +#if __cplusplus >= 202202L && __cpp_lib_spanstream != 202106L
> >       +# error "Feature-test macro __cpp_lib_spanstrean has wrong value in <iosfwd>"
> >       +#endif
> >
> > I would test that __cpp_lib_char8_t is defined when you include this header, even
> > if it is for all headers.
>
> Sure:

The patch seems to have been repeated several times in the email, but
it looks good (several times ;-)
OK for trunk.

> -- >8 --
>
> Subject: [PATCH] libstdc++: Implement LWG 4440 feature-test macros added to
>  <iosfwd>
>
> Note __cpp_lib_char8_t doesn't use the <bits/version.h> mechanism, it's
> defined in c++config and thus provided by all headers by default.
>
> libstdc++-v3/ChangeLog:
>
>         * include/std/iosfwd: Provide feature-test macros
>         __cpp_lib_spanstream and __cpp_lib_syncbuf.
>         * testsuite/27_io/headers/iosfwd/synopsis.cc: Verify values
>         of these FTMs.
> ---
>  libstdc++-v3/include/std/iosfwd                      |  4 ++++
>  .../testsuite/27_io/headers/iosfwd/synopsis.cc       | 12 ++++++++++++
>  2 files changed, 16 insertions(+)
>
> diff --git a/libstdc++-v3/include/std/iosfwd b/libstdc++-v3/include/std/iosfwd
> index 1d5e684b53bb..511b2f3a23f1 100644
> --- a/libstdc++-v3/include/std/iosfwd
> +++ b/libstdc++-v3/include/std/iosfwd
> @@ -39,6 +39,10 @@
>
>  #include <bits/requires_hosted.h> // iostreams
>
> +#define __glibcxx_want_spanstream
> +#define __glibcxx_want_syncbuf
> +#include <bits/version.h>
> +
>    /**
>     *  @defgroup io I/O
>     *
> diff --git a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> index 8d9501f42ef4..81b158b81285 100644
> --- a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> +++ b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> @@ -3,6 +3,18 @@
>
>  #include <iosfwd>
>
> +#if __cplusplus >= 202002L && __cpp_lib_char8_t != 201907L
> +# error "Feature-test macro __cpp_lib_char8_t has wrong value in <iosfwd>"
> +#endif
> +
> +#if __cplusplus >= 202202L && __cpp_lib_spanstream != 202106L
> +# error "Feature-test macro __cpp_lib_spanstrean has wrong value in <iosfwd>"
> +#endif
> +
> +#if __cplusplus >= 202002L && __cpp_lib_syncbuf != 201803L
> +# error "Feature-test macro __cpp_lib_syncbuf has wrong value in <iosfwd>"
> +#endif
> +
>  namespace std
>  {
>    // [iosfwd.syn]
> --
> 2.55.0.481.ga97fcc37c2
>
> Subject: [PATCH] libstdc++: Implement LWG 4440 feature-test macros added to
>  <iosfwd>
>
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk and
> backports?
>
> -- >8 --
>
> Note __cpp_lib_char8_t doesn't use the <bits/version.h> mechanism, it's
> defined in c++config and thus provided by all headers by default.
>
> libstdc++-v3/ChangeLog:
>
>         * include/std/iosfwd: Provide feature-test macros
>         __cpp_lib_spanstream and __cpp_lib_syncbuf.
>         * testsuite/27_io/headers/iosfwd/synopsis.cc: Verify values
>         of these FTMs.
> ---
>  libstdc++-v3/include/std/iosfwd                      |  4 ++++
>  .../testsuite/27_io/headers/iosfwd/synopsis.cc       | 12 ++++++++++++
>  2 files changed, 16 insertions(+)
>
> diff --git a/libstdc++-v3/include/std/iosfwd b/libstdc++-v3/include/std/iosfwd
> index 1d5e684b53bb..511b2f3a23f1 100644
> --- a/libstdc++-v3/include/std/iosfwd
> +++ b/libstdc++-v3/include/std/iosfwd
> @@ -39,6 +39,10 @@
>
>  #include <bits/requires_hosted.h> // iostreams
>
> +#define __glibcxx_want_spanstream
> +#define __glibcxx_want_syncbuf
> +#include <bits/version.h>
> +
>    /**
>     *  @defgroup io I/O
>     *
> diff --git a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> index 8d9501f42ef4..81b158b81285 100644
> --- a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> +++ b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> @@ -3,6 +3,18 @@
>
>  #include <iosfwd>
>
> +#if __cplusplus >= 202002L && __cpp_lib_char8_t != 201907L
> +# error "Feature-test macro __cpp_lib_char8_t has wrong value in <iosfwd>"
> +#endif
> +
> +#if __cplusplus >= 202202L && __cpp_lib_spanstream != 202106L
> +# error "Feature-test macro __cpp_lib_spanstrean has wrong value in <iosfwd>"
> +#endif
> +
> +#if __cplusplus >= 202002L && __cpp_lib_syncbuf != 201803L
> +# error "Feature-test macro __cpp_lib_syncbuf has wrong value in <iosfwd>"
> +#endif
> +
>  namespace std
>  {
>    // [iosfwd.syn]
> --
> 2.55.0.481.ga97fcc37c2
>
> Subject: [PATCH] libstdc++: Implement LWG 4440 feature-test macros added to
>  <iosfwd>
>
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk and
> backports?
>
> -- >8 --
>
> Note __cpp_lib_char8_t doesn't use the <bits/version.h> mechanism, it's
> defined in c++config and thus provided by all headers by default.
>
> libstdc++-v3/ChangeLog:
>
>         * include/std/iosfwd: Provide feature-test macros
>         __cpp_lib_spanstream and __cpp_lib_syncbuf.
>         * testsuite/27_io/headers/iosfwd/synopsis.cc: Verify values
>         of these FTMs.
> ---
>  libstdc++-v3/include/std/iosfwd                      |  4 ++++
>  .../testsuite/27_io/headers/iosfwd/synopsis.cc       | 12 ++++++++++++
>  2 files changed, 16 insertions(+)
>
> diff --git a/libstdc++-v3/include/std/iosfwd b/libstdc++-v3/include/std/iosfwd
> index 1d5e684b53bb..511b2f3a23f1 100644
> --- a/libstdc++-v3/include/std/iosfwd
> +++ b/libstdc++-v3/include/std/iosfwd
> @@ -39,6 +39,10 @@
>
>  #include <bits/requires_hosted.h> // iostreams
>
> +#define __glibcxx_want_spanstream
> +#define __glibcxx_want_syncbuf
> +#include <bits/version.h>
> +
>    /**
>     *  @defgroup io I/O
>     *
> diff --git a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> index 8d9501f42ef4..81b158b81285 100644
> --- a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> +++ b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> @@ -3,6 +3,18 @@
>
>  #include <iosfwd>
>
> +#if __cplusplus >= 202002L && __cpp_lib_char8_t != 201907L
> +# error "Feature-test macro __cpp_lib_char8_t has wrong value in <iosfwd>"
> +#endif
> +
> +#if __cplusplus >= 202202L && __cpp_lib_spanstream != 202106L
> +# error "Feature-test macro __cpp_lib_spanstrean has wrong value in <iosfwd>"
> +#endif
> +
> +#if __cplusplus >= 202002L && __cpp_lib_syncbuf != 201803L
> +# error "Feature-test macro __cpp_lib_syncbuf has wrong value in <iosfwd>"
> +#endif
> +
>  namespace std
>  {
>    // [iosfwd.syn]
> --
> 2.55.0.481.ga97fcc37c2
>
> Subject: [PATCH] libstdc++: Implement LWG 4440 feature-test macros added to
>  <iosfwd>
>
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk and
> backports?
>
> -- >8 --
>
> Note __cpp_lib_char8_t doesn't use the <bits/version.h> mechanism, it's
> defined in c++config and thus provided by all headers by default.
>
> libstdc++-v3/ChangeLog:
>
>         * include/std/iosfwd: Provide feature-test macros
>         __cpp_lib_spanstream and __cpp_lib_syncbuf.
>         * testsuite/27_io/headers/iosfwd/synopsis.cc: Verify values
>         of these FTMs.
> ---
>  libstdc++-v3/include/std/iosfwd                      |  4 ++++
>  .../testsuite/27_io/headers/iosfwd/synopsis.cc       | 12 ++++++++++++
>  2 files changed, 16 insertions(+)
>
> diff --git a/libstdc++-v3/include/std/iosfwd b/libstdc++-v3/include/std/iosfwd
> index 1d5e684b53bb..511b2f3a23f1 100644
> --- a/libstdc++-v3/include/std/iosfwd
> +++ b/libstdc++-v3/include/std/iosfwd
> @@ -39,6 +39,10 @@
>
>  #include <bits/requires_hosted.h> // iostreams
>
> +#define __glibcxx_want_spanstream
> +#define __glibcxx_want_syncbuf
> +#include <bits/version.h>
> +
>    /**
>     *  @defgroup io I/O
>     *
> diff --git a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> index 8d9501f42ef4..81b158b81285 100644
> --- a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> +++ b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> @@ -3,6 +3,18 @@
>
>  #include <iosfwd>
>
> +#if __cplusplus >= 202002L && __cpp_lib_char8_t != 201907L
> +# error "Feature-test macro __cpp_lib_char8_t has wrong value in <iosfwd>"
> +#endif
> +
> +#if __cplusplus >= 202202L && __cpp_lib_spanstream != 202106L
> +# error "Feature-test macro __cpp_lib_spanstrean has wrong value in <iosfwd>"
> +#endif
> +
> +#if __cplusplus >= 202002L && __cpp_lib_syncbuf != 201803L
> +# error "Feature-test macro __cpp_lib_syncbuf has wrong value in <iosfwd>"
> +#endif
> +
>  namespace std
>  {
>    // [iosfwd.syn]
> --
> 2.55.0.481.ga97fcc37c2
>
> Subject: [PATCH] libstdc++: Implement LWG 4440 feature-test macros added to
>  <iosfwd>
>
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk and
> backports?
>
> -- >8 --
>
> Note __cpp_lib_char8_t doesn't use the <bits/version.h> mechanism, it's
> defined in c++config and thus provided by all headers by default.
>
> libstdc++-v3/ChangeLog:
>
>         * include/std/iosfwd: Provide feature-test macros
>         __cpp_lib_spanstream and __cpp_lib_syncbuf.
>         * testsuite/27_io/headers/iosfwd/synopsis.cc: Verify values
>         of these FTMs.
> ---
>  libstdc++-v3/include/std/iosfwd                      |  4 ++++
>  .../testsuite/27_io/headers/iosfwd/synopsis.cc       | 12 ++++++++++++
>  2 files changed, 16 insertions(+)
>
> diff --git a/libstdc++-v3/include/std/iosfwd b/libstdc++-v3/include/std/iosfwd
> index 1d5e684b53bb..511b2f3a23f1 100644
> --- a/libstdc++-v3/include/std/iosfwd
> +++ b/libstdc++-v3/include/std/iosfwd
> @@ -39,6 +39,10 @@
>
>  #include <bits/requires_hosted.h> // iostreams
>
> +#define __glibcxx_want_spanstream
> +#define __glibcxx_want_syncbuf
> +#include <bits/version.h>
> +
>    /**
>     *  @defgroup io I/O
>     *
> diff --git a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> index 8d9501f42ef4..81b158b81285 100644
> --- a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> +++ b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> @@ -3,6 +3,18 @@
>
>  #include <iosfwd>
>
> +#if __cplusplus >= 202002L && __cpp_lib_char8_t != 201907L
> +# error "Feature-test macro __cpp_lib_char8_t has wrong value in <iosfwd>"
> +#endif
> +
> +#if __cplusplus >= 202202L && __cpp_lib_spanstream != 202106L
> +# error "Feature-test macro __cpp_lib_spanstrean has wrong value in <iosfwd>"
> +#endif
> +
> +#if __cplusplus >= 202002L && __cpp_lib_syncbuf != 201803L
> +# error "Feature-test macro __cpp_lib_syncbuf has wrong value in <iosfwd>"
> +#endif
> +
>  namespace std
>  {
>    // [iosfwd.syn]
> --
> 2.55.0.481.ga97fcc37c2
>
> Subject: [PATCH] libstdc++: Implement LWG 4440 feature-test macros added to
>  <iosfwd>
>
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk and
> backports?
>
> -- >8 --
>
> Note __cpp_lib_char8_t doesn't use the <bits/version.h> mechanism, it's
> defined in c++config and thus provided by all headers by default.
>
> libstdc++-v3/ChangeLog:
>
>         * include/std/iosfwd: Provide feature-test macros
>         __cpp_lib_spanstream and __cpp_lib_syncbuf.
>         * testsuite/27_io/headers/iosfwd/synopsis.cc: Verify values
>         of these FTMs.
> ---
>  libstdc++-v3/include/std/iosfwd                      |  4 ++++
>  .../testsuite/27_io/headers/iosfwd/synopsis.cc       | 12 ++++++++++++
>  2 files changed, 16 insertions(+)
>
> diff --git a/libstdc++-v3/include/std/iosfwd b/libstdc++-v3/include/std/iosfwd
> index 1d5e684b53bb..511b2f3a23f1 100644
> --- a/libstdc++-v3/include/std/iosfwd
> +++ b/libstdc++-v3/include/std/iosfwd
> @@ -39,6 +39,10 @@
>
>  #include <bits/requires_hosted.h> // iostreams
>
> +#define __glibcxx_want_spanstream
> +#define __glibcxx_want_syncbuf
> +#include <bits/version.h>
> +
>    /**
>     *  @defgroup io I/O
>     *
> diff --git a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> index 8d9501f42ef4..81b158b81285 100644
> --- a/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> +++ b/libstdc++-v3/testsuite/27_io/headers/iosfwd/synopsis.cc
> @@ -3,6 +3,18 @@
>
>  #include <iosfwd>
>
> +#if __cplusplus >= 202002L && __cpp_lib_char8_t != 201907L
> +# error "Feature-test macro __cpp_lib_char8_t has wrong value in <iosfwd>"
> +#endif
> +
> +#if __cplusplus >= 202202L && __cpp_lib_spanstream != 202106L
> +# error "Feature-test macro __cpp_lib_spanstrean has wrong value in <iosfwd>"
> +#endif
> +
> +#if __cplusplus >= 202002L && __cpp_lib_syncbuf != 201803L
> +# error "Feature-test macro __cpp_lib_syncbuf has wrong value in <iosfwd>"
> +#endif
> +
>  namespace std
>  {
>    // [iosfwd.syn]
> --
> 2.55.0.481.ga97fcc37c2



More information about the Libstdc++ mailing list