diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index edb8947e4c2..b5569066708 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -2951,7 +2951,7 @@ finish_call_expr (tree fn, vec **args, bool disallow_virtual, -Wredundant-move warning. */ suppress_warning (result, OPT_Wpessimizing_move); - if (cfun) + if (cfun && cp_function_chain && !cp_unevaluated_operand) { bool abnormal = true; for (lkp_iterator iter (maybe_get_fns (fn)); iter; ++iter) diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-lambda21.C b/gcc/testsuite/g++.dg/cpp2a/concepts-lambda21.C new file mode 100644 index 00000000000..8d701cd4bbc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-lambda21.C @@ -0,0 +1,69 @@ +// PR c++/115561 +// { dg-do compile { target c++20 } } + +template +auto declval() noexcept -> _Tp&&; + +template +struct enable_if +{ }; + +template +struct enable_if +{ using type = _Tp; }; + +template +using enable_if_t = typename enable_if<_Cond, _Tp>::type; + +template +struct is_void +{ static constexpr bool value = false; }; + +template +using invoke_result_t = + decltype(declval()(declval()...)); + +template +using iter_reference_t = decltype(*declval()); + +struct iter_move_fn +{ + template + constexpr + auto operator() (I &&i) -> void; +} iter_move; + +template +using iter_rvalue_reference_t = decltype(iter_move(declval())); + +template +concept same_as = true; + +template +concept readable_concept_ = + same_as, iter_rvalue_reference_t>; + +template +concept indirectly_readable = + readable_concept_>; + +template +using indirect_result_t = + enable_if_t, + invoke_result_t>>; + +template +concept transformable = + (!is_void>::value); + +template + requires transformable +constexpr void transform(I, Fun) +{ +} + +void foo() +{ + struct B {}; + (void) transform((B*)nullptr, [](B) {return 0; }); +}