c++: mark_single_function and SFINAE [PR108282]

We typically ignore mark_used failure when in a non-SFINAE context for
sake of better error recovery.  But in mark_single_function we're
instead ignoring mark_used failure in a SFINAE context, which ends up
causing the second static_assert here to incorrectly fail.

	PR c++/108282

gcc/cp/ChangeLog:

	* decl2.cc (mark_single_function): Ignore mark_used failure
	only in a non-SFINAE context rather than in a SFINAE one.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/concepts-requires34.C: New test.
This commit is contained in:
Patrick Palka 2023-01-04 14:12:25 -05:00
parent fc349931ad
commit 238e292cf5
2 changed files with 20 additions and 1 deletions

View file

@ -5600,7 +5600,7 @@ mark_single_function (tree expr, tsubst_flags_t complain)
if (is_overloaded_fn (expr) == 1
&& !mark_used (expr, complain)
&& (complain & tf_error))
&& !(complain & tf_error))
return false;
return true;
}

View file

@ -0,0 +1,19 @@
// PR c++/108282
// { dg-do compile { target c++20 } }
template<class T>
concept TEST = requires { T::TT; };
struct C { };
template<class AT>
struct B {
static void TT() requires TEST<AT>;
};
int main() {
static_assert( !TEST<C> );
static_assert( !TEST<B<C>> );
B<C>::TT(); // { dg-error "no match" }
}