Skip to content

Friended struct with concept gives different output in clang/gcc/MSVC  #58833

@danakj

Description

@danakj

GCC bug report: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107544

I don't know which compiler is right, but all three give a different output.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    c++20clang:frontendLanguage frontend issues, e.g. anything involving "Sema"conceptsC++20 conceptsdiverges-from:gccDoes the clang frontend diverge from gcc on this issuediverges-from:msvcDoes the clang frontend diverge from msvc on this issue

    Type

    No type

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions