| Issue |
53364
|
| Summary |
Wrong specialization becomes friend as checked by requires-_expression_
|
| Labels |
new issue
|
| Assignees |
|
| Reporter |
Fedr
|
In the following code, there is template `struct A` with not-type template argument, and `class B` declares `A<0>` as its friend. Then the member function `A<x>::has_access()` is used to check that it has access to private `B::p()`:
```
template<auto>
struct A {
static constexpr bool has_access();
};
class B {
void p() {}
friend struct A<0>;
};
template<auto x>
constexpr bool A<x>::has_access() {
return requires(B b) { b.p(); };
}
static_assert( !A<1>::has_access() );
```
And in Clang `A<1>` gets access to private fields of `B`. Not so in other compilers. Demo: https://gcc.godbolt.org/z/f7qPo6fnj
Related discussion: https://stackoverflow.com/q/70812488/7325599
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs