aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2024-08-27 13:16:27 -0400
committerJason Merrill <jason@redhat.com>2024-09-05 21:29:07 -0400
commit3dafb65bb5c31b169dae180e0664dfcaee64afe6 (patch)
tree377afef495c63c964a7407f929b0a75f19e1d6dc
parenta51f2fc0d80869ab079a93cc3858f24a1fd28237 (diff)
downloadgcc-3dafb65bb5c31b169dae180e0664dfcaee64afe6.zip
gcc-3dafb65bb5c31b169dae180e0664dfcaee64afe6.tar.gz
gcc-3dafb65bb5c31b169dae180e0664dfcaee64afe6.tar.bz2
libstdc++: -Wswitch and ios::openmode
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.
-rw-r--r--libstdc++-v3/include/bits/ios_base.h19
-rw-r--r--libstdc++-v3/testsuite/27_io/ios_base/types/openmode/case_label.cc4
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 b69151c..6e34365 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 95c8658..9e388a5 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__: