The new test includes two lines that currently do not warn because of
GCC compiler bug PR85973; the lines that do warn are the more
important cases.
PR libstdc++/119197
libstdc++-v3/ChangeLog:
* include/std/expected (std::expected): Add [[nodiscard]] to class.
* testsuite/20_util/expected/119197.cc: New test.
Signed-off-by: Arthur O'Dwyer <[email protected]>
---
libstdc++-v3/include/std/expected | 4 ++--
.../testsuite/20_util/expected/119197.cc | 20 +++++++++++++++++++
2 files changed, 22 insertions(+), 2 deletions(-)
create mode 100644 libstdc++-v3/testsuite/20_util/expected/119197.cc
diff --git a/libstdc++-v3/include/std/expected
b/libstdc++-v3/include/std/expected
index 7ab4e4595fa..21522850d7a 100644
--- a/libstdc++-v3/include/std/expected
+++ b/libstdc++-v3/include/std/expected
@@ -367,7 +367,7 @@ namespace __expected
/// @endcond
template<typename _Tp, typename _Er>
- class expected
+ class [[nodiscard]] expected
{
static_assert( ! is_reference_v<_Tp> );
static_assert( ! is_function_v<_Tp> );
@@ -1360,7 +1360,7 @@ namespace __expected
// Partial specialization for std::expected<cv void, E>
template<typename _Tp, typename _Er> requires is_void_v<_Tp>
- class expected<_Tp, _Er>
+ class [[nodiscard]] expected<_Tp, _Er>
{
static_assert( __expected::__can_be_unexpected<_Er> );
diff --git a/libstdc++-v3/testsuite/20_util/expected/119197.cc
b/libstdc++-v3/testsuite/20_util/expected/119197.cc
new file mode 100644
index 00000000000..dd4db6d68f3
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/expected/119197.cc
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++23 } }
+
+// PR libstdc++/119197 - std::expected should be nodiscard
+
+#include <expected>
+
+std::expected<int, int> f();
+std::expected<void, int> g();
+
+void
+test_nodiscard()
+{
+ f(); // { dg-warning "ignoring return" }
+ std::expected<int, int>(42); // c++/PR85973: should warn "ignoring temporary"
+ (void)f(); // OK
+
+ g(); // { dg-warning "ignoring return" }
+ std::expected<void, int>(); // c++/PR85973: should warn "ignoring temporary"
+ (void)g(); // OK
+}
--
2.34.1