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> | ^~~~~~