[Bug libstdc++/99692] Lookup for operator<< skips global scope

pinskia at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sun Mar 21 05:26:15 GMT 2021


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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|c++                         |libstdc++

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Right the problem is here (and not with the compiler itself if there is a
problem):
/home/ubuntu/upstream-gcc/include/c++/11.0.1/ostream:747:46: error: no match
for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘const
std::vector<int>’)
  746 |                            __void_t<decltype(declval<_Ostream&>()
      |                                              ~~~~~~~~~~~~~~~~~~~~
  747 |                                              << declval<const
_Tp&>())>>
      |                                              ^~~~~~~~~~~~~~~~~~~~~~~~


But by definition at this point operator << does not exist and is not
considered as it is not found via ADL because both std::basic_ostream<char> and
std::vector<int> are in the std namespace and the global namespace is not
considered.

/home/ubuntu/upstream-gcc/include/c++/11.0.1/ostream:773:5:   required by
substitution of ‘template<class _Ostream, class _Tp> typename
std::enable_if<std::__and_<std::__not_<std::is_lvalue_reference<_Tp> >,
std::__is_convertible_to_basic_ostream<_Ostream>, std::__is_insertable<typename
std::__is_convertible_to_basic_ostream<_Tp>::__ostream_type, const _Tp&, void>
>::value, typename
std::__is_convertible_to_basic_ostream<_Tp>::__ostream_type>::type
std::operator<<(_Ostream&&, const _Tp&) [with _Ostream = CustomStream; _Tp =
std::vector<int>]’
t78.cc:21:41:   required from here
  template<typename _Ostream, typename _Tp>
    inline
    typename enable_if<__and_<__not_<is_lvalue_reference<_Ostream>>,
                              __is_convertible_to_basic_ostream<_Ostream>,
                              __is_insertable<
                                __rvalue_ostream_type<_Ostream>,
                                const _Tp&>>::value,
                       __rvalue_ostream_type<_Ostream>>::type
    operator<<(_Ostream&& __os, const _Tp& __x)

It is the __is_insertable in the above.
So it might be the wrong type being used to check __is_insertable ....


More information about the Gcc-bugs mailing list