
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.
35 lines
563 B
C++
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>();
|
|
}
|