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:
parent
fc349931ad
commit
238e292cf5
2 changed files with 20 additions and 1 deletions
|
@ -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;
|
||||
}
|
||||
|
|
19
gcc/testsuite/g++.dg/cpp2a/concepts-requires34.C
Normal file
19
gcc/testsuite/g++.dg/cpp2a/concepts-requires34.C
Normal 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" }
|
||||
}
|
Loading…
Add table
Reference in a new issue