https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92078

            Bug ID: 92078
           Summary: error: 'struct std::ptr<Iter>' redeclared with
                    different access
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Keywords: rejects-valid
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
  Target Milestone: ---

The following code using concepts gives a bogus error:

namespace std
{
  template<typename T> T&& declval();

    template<typename Iterator>
    struct iterator_traits;

    template<typename Iter>
      concept iter_has_nested_types = requires {
        typename Iter::iterator_category;
        typename Iter::value_type;
        typename Iter::difference_type;
        typename Iter::reference;
      };

  template<typename Iterator>
    requires (!iter_has_nested_types<Iterator>)
    struct iterator_traits<Iterator>
    {
    private:
      template<typename Iter>
        struct ptr
        { using type = void; };
      template<typename Iter> requires requires { typename Iter::pointer; }
        struct ptr<Iter>
        { using type = typename Iter::pointer; };
      template<typename Iter>
        requires (!requires { typename Iter::pointer; }
                  && requires(Iter& it) { it.operator->(); })
        struct ptr<Iter>
        { using type = decltype(std::declval<Iter&>().operator->()); };
    public:
      using pointer = typename ptr<Iterator>::type;
    };
}

Compiled with trunk and -std=gnu++2a:

access.cc:30:2: error: ‘struct std::ptr<Iter>’ redeclared with different access
   30 |  struct ptr<Iter>
      |  ^~~~~~

Reply via email to