On Thu, 5 Sept 2024 at 22:00, Jason Merrill <[email protected]> wrote:
>
> Tested x86_64-pc-linux-gnu, OK for trunk?
OK, thanks.
>
> -- 8< --
>
> In addition to marking it as flag_enum, we want to avoid warnings about
> not having a case for the implementation detail enumerators
> _S_ios_openmode_*. And also for _S_noreplace in standard modes before it
> was added.
>
> libstdc++-v3/ChangeLog:
>
> * include/bits/ios_base.h (_GLIBCXX_NOREPLACE_UNUSED): New.
> (_Ios_Openmode): Add unused attributes.
> * testsuite/27_io/ios_base/types/openmode/case_label.cc: Handle
> noreplace.
> ---
> libstdc++-v3/include/bits/ios_base.h | 19 ++++++++++++++-----
> .../ios_base/types/openmode/case_label.cc | 4 ++++
> 2 files changed, 18 insertions(+), 5 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/ios_base.h
> b/libstdc++-v3/include/bits/ios_base.h
> index b69151c49ad..6e343658096 100644
> --- a/libstdc++-v3/include/bits/ios_base.h
> +++ b/libstdc++-v3/include/bits/ios_base.h
> @@ -114,8 +114,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b) _GLIBCXX_NOTHROW
> { return __a = __a ^ __b; }
>
> + // If std::ios_base::noreplace isn't available, -Wswitch should ignore
> + // _S_noreplace.
> +#ifdef __glibcxx_ios_noreplace
> +#define _NOREPLACE_UNUSED
> +#else
> +#define _NOREPLACE_UNUSED __attribute__((__unused__))
> +#endif
>
> - enum _Ios_Openmode
> + enum __attribute__((__flag_enum__)) _Ios_Openmode
> {
> _S_app = 1L << 0,
> _S_ate = 1L << 1,
> @@ -123,12 +130,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> _S_in = 1L << 3,
> _S_out = 1L << 4,
> _S_trunc = 1L << 5,
> - _S_noreplace = 1L << 6,
> - _S_ios_openmode_end = 1L << 16,
> - _S_ios_openmode_max = __INT_MAX__,
> - _S_ios_openmode_min = ~__INT_MAX__
> + _S_noreplace _NOREPLACE_UNUSED = 1L << 6,
> + _S_ios_openmode_end __attribute__((__unused__)) = 1L << 16,
> + _S_ios_openmode_max __attribute__((__unused__)) = __INT_MAX__,
> + _S_ios_openmode_min __attribute__((__unused__)) = ~__INT_MAX__
> };
>
> +#undef _NOREPLACE_UNUSED
> +
> _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
> inline _Ios_Openmode
> operator&(_Ios_Openmode __a, _Ios_Openmode __b) _GLIBCXX_NOTHROW
> diff --git
> a/libstdc++-v3/testsuite/27_io/ios_base/types/openmode/case_label.cc
> b/libstdc++-v3/testsuite/27_io/ios_base/types/openmode/case_label.cc
> index 95c86588a54..9e388a51294 100644
> --- a/libstdc++-v3/testsuite/27_io/ios_base/types/openmode/case_label.cc
> +++ b/libstdc++-v3/testsuite/27_io/ios_base/types/openmode/case_label.cc
> @@ -44,6 +44,10 @@ case_labels(bitmask_type b)
> break;
> case std::ios_base::trunc:
> break;
> +#ifdef __glibcxx_ios_noreplace
> + case std::ios_base::noreplace:
> + break;
> +#endif
> case std::_S_ios_openmode_end:
> break;
> case __INT_MAX__:
>
> base-commit: b214ffeecb3f480dd7864bcbfc9ac30100c126f3
> --
> 2.46.0
>