If we aren't really evaluating the expression, it doesn't matter that the
return value is discarded.
Tested x86_64-pc-linux-gnu, applying to trunk.
gcc/cp/ChangeLog:
PR c++/98019
* cvt.c (maybe_warn_nodiscard): Check c_inhibit_evaluation_warnings.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/concepts-nodiscard1.C: Remove xfail.
---
gcc/cp/cvt.c | 3 +++
gcc/testsuite/g++.dg/cpp2a/concepts-nodiscard1.C | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index bcd7c5af81c..29ceaeb24ce 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -1031,6 +1031,9 @@ cp_get_callee_fndecl_nofold (tree call)
static void
maybe_warn_nodiscard (tree expr, impl_conv_void implicit)
{
+ if (!warn_unused_result || c_inhibit_evaluation_warnings)
+ return;
+
tree call = expr;
if (TREE_CODE (expr) == TARGET_EXPR)
call = TARGET_EXPR_INITIAL (expr);
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-nodiscard1.C
b/gcc/testsuite/g++.dg/cpp2a/concepts-nodiscard1.C
index 907e68b1fc2..3d5cd85bc94 100644
--- a/gcc/testsuite/g++.dg/cpp2a/concepts-nodiscard1.C
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-nodiscard1.C
@@ -1,6 +1,6 @@
// PR c++/98019
// { dg-do compile { target c++20 } }
-// { dg-excess-errors *-*-* }
+// Don't give [[nodiscard]] warning for an expression requirement.
template <class T, class U> concept same_as = __is_same_as (T, U);
base-commit: f6e8e2797ebae21e483373e303ec1c7596309625
prerequisite-patch-id: 3a906bda30cfdb62957823e990826e9d6eaa474a
--
2.27.0