public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/99692] New: Lookup for operator<< skips global scope
@ 2021-03-21  4:01 skaniskin at berkeley dot edu
  2021-03-21  5:26 ` [Bug libstdc++/99692] " pinskia at gcc dot gnu.org
                   ` (12 more replies)
  0 siblings, 13 replies; 14+ messages in thread
From: skaniskin at berkeley dot edu @ 2021-03-21  4:01 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 99692
           Summary: Lookup for operator<< skips global scope
           Product: gcc
           Version: 10.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: skaniskin at berkeley dot edu
  Target Milestone: ---

The following code is rejected by g++. 

#include <ostream>
#include <vector>

struct CustomStream : std::ostream {};

std::ostream& operator<<(std::ostream& s, const std::vector<int>&) 
{
    return s;
}

CustomStream&& operator<<(CustomStream&& s, const std::vector<int>& v)  
{
    static_cast<std::ostream&>(s) << v;
    return std::move(s);
}

int main() 
{
    CustomStream() << std::vector<int>{};
}

The problem is there with all recent versions of gcc and independent of
compiler flags

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug libstdc++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
@ 2021-03-21  5:26 ` pinskia at gcc dot gnu.org
  2021-03-21  5:28 ` pinskia at gcc dot gnu.org
                   ` (11 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-03-21  5:26 UTC (permalink / raw)
  To: gcc-bugs

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 ....

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug libstdc++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
  2021-03-21  5:26 ` [Bug libstdc++/99692] " pinskia at gcc dot gnu.org
@ 2021-03-21  5:28 ` pinskia at gcc dot gnu.org
  2021-03-21  6:01 ` skaniskin at gmail dot com
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-03-21  5:28 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #1)
> 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 ....

If anything it is the __rvalue_ostream_type<_Ostream> part if I am reading this
code correctly.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug libstdc++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
  2021-03-21  5:26 ` [Bug libstdc++/99692] " pinskia at gcc dot gnu.org
  2021-03-21  5:28 ` pinskia at gcc dot gnu.org
@ 2021-03-21  6:01 ` skaniskin at gmail dot com
  2021-03-21 12:21 ` redi at gcc dot gnu.org
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: skaniskin at gmail dot com @ 2021-03-21  6:01 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #3 from Sergey Kaniskin <skaniskin at gmail dot com> ---
(In reply to Andrew Pinski from comment #1)
> Right the problem is here (and not with the compiler itself if there is a
> problem)

I was unsure whether to file it under compiler or stdlibc++ as it’s accepted by
another compilers using stdlibc++.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug libstdc++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
                   ` (2 preceding siblings ...)
  2021-03-21  6:01 ` skaniskin at gmail dot com
@ 2021-03-21 12:21 ` redi at gcc dot gnu.org
  2021-03-21 12:23 ` redi at gcc dot gnu.org
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: redi at gcc dot gnu.org @ 2021-03-21 12:21 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Sergey Kaniskin from comment #3)
> I was unsure whether to file it under compiler or stdlibc++ as it’s accepted
> by another compilers using stdlibc++.

There's no such component, it's libstdc++. But if the same libstdc++ code works
with other compilers then it's probably not a libstdc++ bug.

The __rvalue_ostream_type constraints are going away soon:
https://gcc.gnu.org/pipermail/gcc-patches/2021-March/566863.html

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug libstdc++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
                   ` (3 preceding siblings ...)
  2021-03-21 12:21 ` redi at gcc dot gnu.org
@ 2021-03-21 12:23 ` redi at gcc dot gnu.org
  2021-03-21 13:56 ` skaniskin at gmail dot com
                   ` (7 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: redi at gcc dot gnu.org @ 2021-03-21 12:23 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #1)
> 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.

Which seems correct to me. Users should not be overloading operator<< for types
defined by the standard library anyway. You don't own vector<int> so you don't
get to say how it should be output to std::ostream.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug libstdc++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
                   ` (4 preceding siblings ...)
  2021-03-21 12:23 ` redi at gcc dot gnu.org
@ 2021-03-21 13:56 ` skaniskin at gmail dot com
  2021-03-21 23:24 ` redi at gcc dot gnu.org
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: skaniskin at gmail dot com @ 2021-03-21 13:56 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #6 from Sergey Kaniskin <skaniskin at gmail dot com> ---

> Which seems correct to me. Users should not be overloading operator<< for
> types defined by the standard library anyway. You don't own vector<int> so
> you don't get to say how it should be output to std::ostream.

I am sorry, do you mean it is a valid rejection or that it's just a bad taste?

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug libstdc++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
                   ` (5 preceding siblings ...)
  2021-03-21 13:56 ` skaniskin at gmail dot com
@ 2021-03-21 23:24 ` redi at gcc dot gnu.org
  2021-05-06  4:07 ` [Bug c++/99692] " skaniskin at gmail dot com
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: redi at gcc dot gnu.org @ 2021-03-21 23:24 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> ---
I mean that the test used in the library code is doing the right thing. I
haven't investigated whether the compiler is not handling the lookup correctly,
but I don't think there's a libstdc++ bug here.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug c++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
                   ` (6 preceding siblings ...)
  2021-03-21 23:24 ` redi at gcc dot gnu.org
@ 2021-05-06  4:07 ` skaniskin at gmail dot com
  2021-05-06  9:05 ` redi at gcc dot gnu.org
                   ` (4 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: skaniskin at gmail dot com @ 2021-05-06  4:07 UTC (permalink / raw)
  To: gcc-bugs

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

Sergey Kaniskin <skaniskin at gmail dot com> changed:

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

--- Comment #8 from Sergey Kaniskin <skaniskin at gmail dot com> ---
Thanks to Junekey Jeon, I have an example that does not overload operator<< for
a member of std.

#include <iostream>
#include <vector>

struct CustomStream : std::ostream {};

namespace N {
    class A{};
}

std::ostream& operator<<(std::ostream& s, const N::A&) 
{
    return s;
}

CustomStream&& operator<<(CustomStream&& s, const N::A& v)  
{
    static_cast<std::ostream&>(s) << v;
    return std::move(s);
}

int main() 
{
    CustomStream() << N::A{};
}

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug c++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
                   ` (7 preceding siblings ...)
  2021-05-06  4:07 ` [Bug c++/99692] " skaniskin at gmail dot com
@ 2021-05-06  9:05 ` redi at gcc dot gnu.org
  2021-05-06  9:38 ` redi at gcc dot gnu.org
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: redi at gcc dot gnu.org @ 2021-05-06  9:05 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #9 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Jonathan Wakely from comment #4)
> The __rvalue_ostream_type constraints are going away soon:
> https://gcc.gnu.org/pipermail/gcc-patches/2021-March/566863.html

N.B. that change is on gcc trunk now.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug c++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
                   ` (8 preceding siblings ...)
  2021-05-06  9:05 ` redi at gcc dot gnu.org
@ 2021-05-06  9:38 ` redi at gcc dot gnu.org
  2021-05-06 12:12 ` redi at gcc dot gnu.org
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: redi at gcc dot gnu.org @ 2021-05-06  9:38 UTC (permalink / raw)
  To: gcc-bugs

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

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
           See Also|                            |https://gcc.gnu.org/bugzill
                   |                            |a/show_bug.cgi?id=51577
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2021-05-06

--- Comment #10 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Reduced:

namespace std
{

struct ostream { };

template<typename T> T&& declval();

template<typename...> using void_t = void;

struct false_type { static constexpr bool value = false; };
struct true_type { static constexpr bool value = true; };

template<bool, typename = void> struct enable_if { };
template<typename T> struct enable_if<true, T> { using type = T; };

  void __is_convertible_to_basic_ostream_test(ostream*);

  template<typename _Tp, typename = void>
    struct __is_convertible_to_basic_ostream
    : false_type
    { };

  template<typename _Tp>
    struct __is_convertible_to_basic_ostream<_Tp,
       decltype(__is_convertible_to_basic_ostream_test(declval<_Tp*>()))>
    : true_type
    {
      using __ostream_type = ostream&;
    };

  template<typename _Tp>
    struct __is_convertible_to_basic_ostream<_Tp&>
    : false_type
    { using __ostream_type = void; };

  template<typename _Ostream, typename _Tp, typename = void>
    struct __is_insertable : false_type {};

  template<typename _Ostream, typename _Tp>
    struct __is_insertable<_Ostream, _Tp,
                           void_t<decltype(declval<_Ostream&>()
                                             << declval<const _Tp&>())>>
    : true_type {};

  template<typename _Ostream>
    using __rvalue_ostream_type =
      typename __is_convertible_to_basic_ostream<
        _Ostream>::__ostream_type;

  template<typename _Ostream, typename _Tp>
    inline
    typename enable_if<__is_convertible_to_basic_ostream<_Ostream>::value
                       && __is_insertable<__rvalue_ostream_type<_Ostream>,
                                          const _Tp&>::value,
                       __rvalue_ostream_type<_Ostream>>::type
    operator<<(_Ostream&& __os, const _Tp&)
    {
      return __os;
    }

}

struct CustomStream : std::ostream {};

namespace N {
    class A{};
}

std::ostream& operator<<(std::ostream& s, const N::A&) 
{
    return s;
}

CustomStream& operator<<(CustomStream&& s, const N::A&)  
{
  return s;
}

int main() 
{
    CustomStream() << N::A{};
}


Clang accepts this, GCC doesn't.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug c++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
                   ` (9 preceding siblings ...)
  2021-05-06  9:38 ` redi at gcc dot gnu.org
@ 2021-05-06 12:12 ` redi at gcc dot gnu.org
  2021-05-06 13:07 ` redi at gcc dot gnu.org
  2021-12-16 18:47 ` ppalka at gcc dot gnu.org
  12 siblings, 0 replies; 14+ messages in thread
From: redi at gcc dot gnu.org @ 2021-05-06 12:12 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #11 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Jonathan Wakely from comment #10)
>   template<typename _Ostream, typename _Tp>
>     struct __is_insertable<_Ostream, _Tp,
> 			   void_t<decltype(declval<_Ostream&>()
> 					     << declval<const _Tp&>())>>

The problem is that this check produces a hard error (rather than substitution
failure) for declval<std::ostream&>() << declval<const N::A&>().

The relevant operator is not found by ADL, because it's not in the associated
namespaces of std::ostream or N::A (which is IMHO a design error in the code,
but nevermind). So the void_t expression should get a substitution error.

I think the problem is that PR 51577 causes GCC to look in the global scope and
so incorrectly find the declaration of:

std::ostream& operator<<(std::ostream& s, const N::A&) 

which means that the __is_insertable check ... goes wrong somehow? I think it
makes the void_t expression ambiguous because of the global operator<< overload
which is not meant to be found.

The reduced example above can be reduced further:

namespace std
{

struct ostream { };

template<typename T> T&& declval();

template<typename...> using void_t = void;

struct false_type { static constexpr bool value = false; };
struct true_type { static constexpr bool value = true; };

  template<typename _Ostream, typename _Tp, typename = void>
    struct __is_insertable : false_type {};

  template<typename _Ostream, typename _Tp>
    struct __is_insertable<_Ostream, _Tp,
                           void_t<decltype(declval<_Ostream&>()
                                             << declval<const _Tp&>())>>
    : true_type {};

}

struct CustomStream : std::ostream {};

namespace N {
    class A{};
}

std::ostream& operator<<(std::ostream& s, const N::A&) 
{
    return s;
}

int main() 
{
  static_assert( ! std::__is_insertable<std::ostream, N::A>::value, "" );
}

This avoids the hard error in __is_insertable, but GCC fails the static_assert
(where as Clang passes it) which is PR 51577.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug c++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
                   ` (10 preceding siblings ...)
  2021-05-06 12:12 ` redi at gcc dot gnu.org
@ 2021-05-06 13:07 ` redi at gcc dot gnu.org
  2021-12-16 18:47 ` ppalka at gcc dot gnu.org
  12 siblings, 0 replies; 14+ messages in thread
From: redi at gcc dot gnu.org @ 2021-05-06 13:07 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #12 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Jonathan Wakely from comment #9)
> (In reply to Jonathan Wakely from comment #4)
> > The __rvalue_ostream_type constraints are going away soon:
> > https://gcc.gnu.org/pipermail/gcc-patches/2021-March/566863.html
> 
> N.B. that change is on gcc trunk now.

And the gcc-11 branch, so the original testcases compile now because the
problematic __is_insertable check isn't in the library now. The reduced cases
above still fail on all branches.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Bug c++/99692] Lookup for operator<< skips global scope
  2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
                   ` (11 preceding siblings ...)
  2021-05-06 13:07 ` redi at gcc dot gnu.org
@ 2021-12-16 18:47 ` ppalka at gcc dot gnu.org
  12 siblings, 0 replies; 14+ messages in thread
From: ppalka at gcc dot gnu.org @ 2021-12-16 18:47 UTC (permalink / raw)
  To: gcc-bugs

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

Patrick Palka <ppalka at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|---                         |FIXED
             Status|NEW                         |RESOLVED
   Target Milestone|---                         |12.0

--- Comment #13 from Patrick Palka <ppalka at gcc dot gnu.org> ---
Should be fully fixed for GCC 12 by r12-6022.

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2021-12-16 18:47 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-21  4:01 [Bug c++/99692] New: Lookup for operator<< skips global scope skaniskin at berkeley dot edu
2021-03-21  5:26 ` [Bug libstdc++/99692] " pinskia at gcc dot gnu.org
2021-03-21  5:28 ` pinskia at gcc dot gnu.org
2021-03-21  6:01 ` skaniskin at gmail dot com
2021-03-21 12:21 ` redi at gcc dot gnu.org
2021-03-21 12:23 ` redi at gcc dot gnu.org
2021-03-21 13:56 ` skaniskin at gmail dot com
2021-03-21 23:24 ` redi at gcc dot gnu.org
2021-05-06  4:07 ` [Bug c++/99692] " skaniskin at gmail dot com
2021-05-06  9:05 ` redi at gcc dot gnu.org
2021-05-06  9:38 ` redi at gcc dot gnu.org
2021-05-06 12:12 ` redi at gcc dot gnu.org
2021-05-06 13:07 ` redi at gcc dot gnu.org
2021-12-16 18:47 ` ppalka at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).