https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107544
Bug ID: 107544 Summary: Friended struct with concept gives different output in clang/gcc/MSVC Product: gcc Version: 12.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: danakj at orodu dot net Target Milestone: --- I don't know which compiler is right, but all three give a different output. So I will report it here, as the GCC result looks wrong and exposes private data. https://godbolt.org/z/7Pq3eWhc8 ``` #include <compare> #include <concepts> #include <iostream> template <class T> concept HasTag = requires { T::Tag; requires std::same_as<decltype(T::Tag), const bool>; }; template <class T> struct check_tag final { static constexpr bool value() requires(!HasTag<T>) { return false; } static constexpr bool value() requires(HasTag<T>) { return T::Tag; }; }; struct S { private: template <class T> friend struct check_tag; static constexpr bool Tag = true; }; int main() { std::cout << HasTag<S> << "\n"; std::cout << check_tag<S>::value() << "\n"; } ``` Clang output (the concept sees private data if used in friend): 0 1 GCC output (the concept always sees private data): 1 1 MSVC output (the concept never sees private data): 0 0