antangelo fed4e3a6eb
[clang] Exclude non-template classes when checking if constraint refers to containing template arguments (#74265)
When checking if the constraint uses any enclosing template parameters
for [temp.friend]p9, if a containing record is used as argument, we
assume that the constraint depends on enclosing template parameters
without checking if the record is templated. The reproducer from the bug
is included as a test case.

Fixes #71595
2023-12-06 20:17:59 -05:00

35 lines
660 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();
temp(); // expected-note {{implicitly declared private here}}
};
template<C<temp<int>> T>
void g() {
auto v = temp<T>(); // expected-error {{calling a private constructor of class 'temp<int>'}}
}
void h() {
f<int>();
g<int>(); // expected-note {{in instantiation of function template specialization 'g<int>' requested here}}
}