antangelo 46a395d8c4
[clang] Emit error for invalid friend functions under [temp.friend]p9 (#78083)
Emits an error for friend FunctionDecls that either:

* are not templates and have a requires clause
* are templates, and have a constrained parameter that depends on a
template parameter from an enclosing template

and are not a definition.

For a non-template friend function with a requires clause, if the
function is not templated then the original error message indicating
that such a function is disallowed is shown instead, as the function
will still be rejected if a definition is added.
2024-01-16 21:06:02 -05:00

35 lines
563 B
C++

// RUN: %clang_cc1 -std=c++20 -verify %s
template<class T, class U>
concept C = true;
class non_temp {
template<C<non_temp> T>
friend void f();
non_temp();
};
template<C<non_temp> T>
void f() {
auto v = non_temp();
}
template<class A>
class temp {
template<C<temp> T>
friend void g(); // expected-error {{friend declaration with a constraint that depends on an enclosing template parameter must be a definition}}
temp();
};
template<C<temp<int>> T>
void g() {
auto v = temp<T>();
}
void h() {
f<int>();
g<int>();
}