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

Reply via email to